設計模式-原型模式(Prototype)
概要
記憶關鍵詞:原型例項、複製
定義:用原型例項指定建立物件的種類,並且透過複製這些原型建立新的物件。
分析:當客戶提交一個請求,請求是沿鏈傳遞直至有一個物件負責處理它。
原型模式結構圖如下:
## 1.涉及知識點
- 深複製和淺複製:深複製和淺複製是隻針對引用資料型別的
### 1.1 淺複製
- 淺複製是在按位(bit)複製物件,這個物件有著原始物件屬性值的一份精確複製
- 如果有巢狀物件的時候,使用淺複製會帶來資料安全方面的隱患,這就到了需要深複製的時候
### 1.2 深複製
- 對於有多層物件的,每個物件都需要實現Cloneable並重寫clone()方法,才可以實現了物件的序列層層複製。
說明:徹底的深複製幾乎是不可能實現的,那樣不但可能存在引用關係非常複雜的情況,也可能存在引用鏈的某一級上引用了一個沒有實現Cloneable介面的第三方物件的情況。
## 2.核心用途
- 解決構建複雜物件的資源消耗問題,提升建立物件的效率。(比如在迴圈體內產生大量物件的時候)
- 保護性複製,防止外部對只讀物件進行修改。
## 3.分析
- 原型模式就是從一個樣板物件中複製出一個內部屬性一致的物件
- 原型模式是在記憶體中複製二進位制流,比new一個物件的效能好很多
- 絕大多數設計模式都是犧牲效能提升開發效率的,原型模式則是為數不多的犧牲開發效率提升效能的設計模式
## 4.注意
- 原型模式中的複製不會執行建構函式,這是因為原型模式是透過克隆來建立新物件的,而不是透過建構函式。當我們使用原型模式時,需要注意一些情況:
- 1)成員變數的克隆: 如果物件中包含引用型別的成員變數,需要確保這些引用型別也能正確地進行克隆。如果不進行深複製,那麼原型模式的克隆物件和原物件中的引用型別成員將指向相同的物件,這可能導致意外的修改。
- 2)克隆方法的實現: 類需要實現 Cloneable 介面,並重寫 clone 方法。在 clone 方法中,要確保對引用型別進行適當的克隆,以防止淺複製問題。
- 3)建構函式的注意事項:由於克隆不會執行建構函式,因此如果在建構函式中進行了一些重要的初始化工作,我們需要確保這些初始化工作在克隆後得到正確的結果。
有時候,我們可能需要在克隆方法中手動執行必要的初始化步驟。
## 5.應用場景
- Java的Object類中
在Java語言中,Object類實現了Cloneable介面,一個物件可以透過呼叫Clone()方法生成物件,這就是原型模式的典型應用