設計模式之原型模式,設計模式原型
定義(From 百度百科)
用原型執行個體指定建立對象的種類,並且通過拷貝這些原型建立新的對象。
UML類圖:
具體代碼:
public class Client { public static void main(String[] args) {// Director d = new Director(new ConcreteBuilder());// d.construct(); ConcretePrototype1 prototype = new ConcretePrototype1(); for (int i = 0; i < 10; i++) { ConcretePrototype1 x = (ConcretePrototype1) prototype.clone(); x.test1(); } }}public class Prototype implements Cloneable { public Prototype clone() { Prototype prototype = null; try{ prototype = (Prototype)super.clone(); }catch(CloneNotSupportedException e){ e.printStackTrace(); } return prototype; }}public class ConcretePrototype1 extends Prototype { public void test1() { System.out.println(this); System.out.println("123"); }}
各部分說明:
Prototype 原型類實現Cloneable介面。
ConcretePrototype1 原型類Prototype的子類
模式詳細說明:
通過複製複製一個對象執行個體
複製出來的新的對象複製原執行個體的值
原型模式的注意事項:
使用原型模式複製對象不會調用類的構造方法。因為對象的複製是通過調用Object類的clone方法來完成的,連存取權限都對原型模式無效。還記得單例模式嗎?單例模式中,
只要將構造方法的存取權限設定為private型,就可以實現單例。但是clone方法直接無視構造方法的許可權,所以,單例模式與原型模式是衝突的,在使用時要特別注意。
clone方法,執行的是淺拷貝,也就是說如果是參考型別的屬性,則它不會進行拷貝,而是只拷貝引用。
優缺點:
優點:
clone方法是由虛擬機器直接複製記憶體塊執行,速度比new快很多
運行時擷取對象及相應的狀態
缺點:
Prototype必須實現clone方法,如果Prototype裡的屬性很多參考型別,甚至對象裡的應用,那就要遞迴實現clone方法,會很複雜,新增引用屬性時,會去更改clone方法的實現。