PrototypePattern原型模式

原型模式

1.定義

用原型實例指定建立對象的種類,而且經過拷貝這些原型建立新的對象java

Java自帶一個Cloneable接口,原型類實現該接口並重寫clone方法,經過調用該方法建立新的對象。這種不經過new關鍵字來產生一個對象,而是經過對象複製來實現的模式叫作原型模式。數組

原型類安全

public class PrototypeClass implements Cloneable {

    @Override
    protected Object clone() {

        PrototypeClass prototypeClass = null;

        try {
            prototypeClass = (PrototypeClass) super.clone();
        } catch (CloneNotSupportedException cloneNotSupportedException) {
            // TODO 異常處理
        }

        return prototypeClass;
    }
}

2.應用

2.1 優勢

  • 性能良好:原型模式是在內存二進制流的拷貝,比直接使用new關鍵字建立對象性能好不少。
  • 逃避構造函數的約束:直接在內存中拷貝,不會執行其構造函數,所以也是缺點。

2.2 使用場景

  • 資源優化場景:類初始化須要消耗很是多的資源。
  • 性能和安全要求
  • 一個對象多個修改者的場景

實際項目中,原型模式不多單獨出現。通常和工廠方法模式結合使用,經過clone方法建立對象,並由工廠方法提供給調用者。ide

3.注意事項

3.1 構造函數不會被執行

即逃避構造函數的約束。函數

3.2 淺拷貝和深拷貝

若原型類中存在屬性爲引用對象類型時,Java作了一個偷懶的拷貝動做,Object類提供的方法只是clone本對象,對其內部的數組,引用對象等都不拷貝,仍是指向原生對象的地址,即引用賦值而不是對象賦值,而基本類型都會被拷貝,這種拷貝就叫作淺拷貝。對於String類型,沒有clone方法,經過字符串池在內存中建立新字符串,所以使用時String同基本類型效果一致。性能

想實現對象的深刻拷貝須要在原型類的clone方法中對引用類型的對象屬性再次調用clone方法。優化

3.3 clone與final

對象的clonefinal關鍵字是有衝突的,要使用clone方法,原型類的成員變量上不要增長final關鍵字。prototype

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息