簡單隻是看不見的複雜, 這很原型, 傳送 原型模式(proptotype pattern)定義 用原型模式指定創建對象, 並且通過拷貝這些原型對象創建新的對象 原型模式的使用 原型模式的優缺點 優點: 由於clone方法是由虛擬機直接複製記憶體塊執行, 所以在速度上比使用new的方式創建對象要快 可以 ...
原型模式(proptotype pattern)定義
- 用原型模式指定創建對象, 並且通過拷貝這些原型對象創建新的對象
原型模式的使用
- 對象的創建非常複雜, 可以使用原型模式快捷的創建對象
- 在運行過程中不知道對象的具體類型, 可使用原型模式創建一個相同類型的對象, 或者在運行過程中動態的獲取到一個對象的狀態
- 對於clone方法, 它執行的是淺拷貝, 也就是說如果是引用類型的屬性, 則它不會進行拷貝, 而是只拷貝引用, 也就是說拷貝的對象中還有個成員對象引用
- 如果想要使用clone的深度拷貝, 那就需要重寫clone
原型模式的優缺點
- 優點:
- 由於clone方法是由虛擬機直接複製記憶體塊執行, 所以在速度上比使用new的方式創建對象要快
- 可以基於原型, 快速的創建一個對象, 而無需知道創建的細節
- 可以在運行時動態的獲取對下的類型以及狀態, 從而創建一個對象
- 缺點:
- 實現深度拷貝比較困難, 需要很多額外的代碼量
navtive級別的clone深度解析
- 輕度解析:
- 在jdk api的文檔中 明確表示, clone是創建並且返回此對象的副本(即為依賴於對象的類)
- 必須實現Cloneable, 複製會報錯
- 深度解析: 這部分源碼是彙編, 隨意看看瞭解一下
- 先檢測是否實現了cloneable
- 獲取對象的大小
- 判斷是否是數組 是就 ==>4 否則直接第5
- 獲取長度
- 分配記憶體, 寫入元數據
- copy記憶體塊
- 初始化對象頭, 包含哈市code ,gc信息, 鎖信息
- 查看是否有finalize方法, 有就需要註冊下
- 將記憶體對象轉換為java本地對象返回
這塊後面確實相當複雜, 還可以深度追擊java記憶體模型等等