模式動機 原型模式(Prototype Pattern)結構較為簡單,它是一種特殊的創建型模式,當需要創建大量相同或者相似對象時,可以通過對一個已有對象的複製獲取更多對象。Java語言提供了較為簡單的原型模式解決方案,只需要創建一個原型對象,然後通過在類中定義的克隆方法複製自己。該模式應用較為廣泛, ...
模式動機
原型模式(Prototype Pattern)結構較為簡單,它是一種特殊的創建型模式,當需要創建大量相同或者相似對象時,可以通過對一個已有對象的複製獲取更多對象。Java語言提供了較為簡單的原型模式解決方案,只需要創建一個原型對象,然後通過在類中定義的克隆方法複製自己。該模式應用較為廣泛,可以快速生成大量的相似對象,極大提高了創建新實例的效率。
總結一下就是
- 複製一個對象,從而克隆出多個與原型對象一模一樣的對象
- 有些對象的創建過程較為複雜,而且需要頻繁創建
- 通過給出一個原型對象來指明所要創建的對象的類型,然後用複製這個原型對象的辦法創建出更多同類型的對象
模式定義
- 原型模式是一種對象創建型模式,用原型實例指定創建對象的種類,並且通過複製這些原型創建新的對象。
- 原型模式允許通過一個原型對象創建一個或多個同類型的其他對象,而無須知道任何創建的細節
工作原理
模式結構
模式分析
- 淺克隆(Shallow Clone):當原型對象被覆制時,只複製它本身和其中包含的值類型的成員變數,而引用類型的成員變數並沒有複製
- 深克隆(Deep Clone):除了對象本身被覆制外,對象所包含的所有成員變數也將被覆制
-
原型模式優點
- 簡化對象的創建過程,通過複製一個已有實例可以提高新實例的創建效率
- 擴展性較好
- 簡化創建結構,原型模式中產品的複製是通過封裝在原型類中的克隆方法實現的,無須專門的工廠類來創建產品
- 可以使用深克隆的方式保存對象的狀態,以便在需要的時候使用,可輔助實現撤銷操作
-
原型模式缺點
- 需要為每一個類配備一個克隆方法,而且該克隆方法位於一個類的內部,當對已有的類進行改造時,需要修改源代碼,違背了開閉原則。
- 在實現深克隆時需要編寫較為複雜的代碼,而且當對象之間存在多重的嵌套引用時,為了實現深克隆,每一層對象對應的類都必須支持深克隆,實現起來可能會比較麻煩。
-
使用情形
- 創建新對象成本較大,新對象可以通過複製已有對象來獲得,如果是相似對象,則可以對其成員變數稍作修改
- 系統要保存對象的狀態,而對象的狀態變化很小
- 需要避免使用分層次的工廠類來創建分層次的對象
擴展
原型管理器(Prototype Manager)將多個原型對象存儲在一個集合中供客戶端使用,它是一個專門負責克隆對象的工廠,其中定義了一個集合用於存儲原型對象,如果需要某個原型對象的一個克隆,可以通過複製集合中對應的原型對象來獲得。
原型管理器中針對抽象類型編程,以便擴展。
原型管理器類
public class PrototypeManager {
private Hashtable prototypeTable=new Hashtable(); //Hashtable存儲原型對象
public PrototypeManager() {
prototypeTable.put("A", new ConcretePrototypeA());
prototypeTable.put("B", new ConcretePrototypeB());
}
public void add(String key, Prototype prototype) {
prototypeTable.put(key,prototype);
}
public Prototype get(String key) {
Prototype clone = null;
clone = ((Prototype)prototypeTable.get(key)).clone(); //克隆方法創建新對象
return clone;
}
}
本文來自博客園,作者:街酒,轉載請註明原文鏈接:https://www.cnblogs.com/sorrymine/p/17389531.html