設計模式三:原型模式 – JAVA編程語言程序開發技術文章

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

 

類圖:

 

 

優點及適用場景:

    使用原型模式創建對象比直接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; 
    } 

發佈留言