天天看點

Head First設計模式之原型模式

用原型執行個體指定建立對象的種類,并且通過拷貝這些原型建立新的對象。

原型模式是一種比較簡單的模式,也非常容易了解,實作一個接口,重寫一個方法即完成了原型模式。在實際應用中,原型模式很少單獨出現。經常與其他模式混用,他的原型類Prototype也常用抽象類來替代。

Head First設計模式之原型模式

原型模式主要用于對象的複制,它的核心是就是類圖中的原型類Prototype。Prototype類需要具備以下兩個條件:

實作Cloneable接口。在java語言有一個Cloneable接口,它的作用隻有一個,就是在運作時通知虛拟機可以安全地在實作了此接口的類上使用clone方法。在java虛拟機中,隻有實作了這個接口的類才可以被拷貝,否則在運作時會抛出CloneNotSupportedException異常。

重寫Object類中的clone方法。Java中,所有類的父類都是Object類,Object類中有一個clone方法,作用是傳回對象的一個拷貝,但是其作用域protected類型的,一般的類無法調用,是以,Prototype類需要将clone方法的作用域修改為public類型。

1、資源優化場景。

2、類初始化需要消化非常多的資源,這個資源包括資料、硬體資源等。

3、性能和安全要求的場景。

4、通過 new 産生一個對象需要非常繁瑣的資料準備或通路權限,則可以使用原型模式。

5、一個對象多個修改者的場景。

6、一個對象需要提供給其他對象通路,而且各個調用者可能都需要修改其值時,可以考慮使用原型模式拷貝多個對象供調用者使用。

7、在實際項目中,原型模式很少單獨出現,一般是和工廠方法模式一起出現,通過 clone 的方法建立一個對象,然後由工廠方法提供給調用者。

注意事項:與通過對一個類進行執行個體化來構造新對象不同的是,原型模式是通過拷貝一個現有對象生成新對象的。淺拷貝實作 Cloneable,重寫,深拷貝是通過實作 Serializable 讀取二進制流。

優點:

  1、對用戶端隐藏具體的實作類型:原型模式的用戶端,隻知道原型接口的類型,并不知道具體的實作類型,進而減少了用戶端對這些具體實作類型的依賴。

  2、在運作時動态改變具體的實作類型:原型模式可以在運作期間,由客戶來注冊符合原型接口的實作類型,也可以動态的改變具體的實作類型,看起來接口沒有任何變化,但其實運作的已經是另外一個類執行個體了。因為克隆一個原型就類似于執行個體化一個類。

缺點:

  深度克隆方法實作會比較困難:原型模式最大的缺點就在于每個原型的子類都必須實作clone的操作,尤其在包含引用類型的對象時,clone方法會比較麻煩,必須要能夠遞歸的讓所有的相關對象都要正确的實作克隆。

參考:

http://www.cnblogs.com/JsonShare/p/7300124.html

http://www.runoob.com/design-pattern/prototype-pattern.html