原型模式

定義:
用原型實例指定創建對象的種類,並通過拷貝這些原型創建新的對象。

 

類圖:

 

 

優點及適用場景:

    使用原型模式創建對象比直接new一個對象在性能上要好的多,因爲Object類的clone方法是一個本地方法,它直接操作內存中的二進制流,特別是複製大對象時,性能的差別非常明顯。
    使用原型模式的另一個好處是簡化對象的創建,使得創建對象就像我們在編輯文檔時的複製粘貼一樣簡單。因爲以上優點,所以在需要重複地創建相似對象時可以考慮使用原型模式。比如需要在一個循環體內創建對象,假如對象創建過程比較複雜或者循環次數很多的話,使用原型模式不但可以簡化創建過程,而且可以使系統的整體性能提高很多。

 

注意事項:
    使用原型模式複製對象不會調用類的構造方法。因爲對象的複製是通過調用Object類的clone方法來完成的,它直接在內存中複製數據,因此不會調用到類的構造方法。不但構造方法中的代碼不會執行,甚至連訪問權限都對原型模式無效。還記得單例模式嗎?單例模式中,只要將構造方法的訪問權限設置爲private型,就可以實現單例。但是clone方法直接無視構造方法的權限,所以,單例模式與原型模式是衝突的,在使用時要特別注意。
    深拷貝與淺拷貝。Object類的clone方法只會拷貝對象中的基本的數據類型,對於數組、容器對象、引用對象等都不會拷貝,這就是淺拷貝。如果要實現深拷貝,必須將原型模式中的數組、容器對象、引用對象等另行拷貝。例如:
[java] 
public class Prototype implements Cloneable { 
    // 由於ArrayList不是基本類型,所以成員變量list,不會被拷貝,需要我們自己實現深拷貝 
    private ArrayList list = new ArrayList(); 
    public Prototype clone() { 
        Prototype prototype = null; 
        try { 
            prototype = (Prototype) super.clone(); 
            prototype.list = (ArrayList) this.list.clone(); 
        } catch (CloneNotSupportedException e) { 
            e.printStackTrace(); 
        } 
        return prototype; 
    } 

發佈了9 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章