設計模式-5原型模式
阿新 • • 發佈:2019-01-14
意圖:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。
主要解決:在執行期建立和刪除原型。
何時使用:
- 1、當一個系統應該獨立於它的產品建立,構成和表示時。
- 2、當要例項化的類是在執行時刻指定時,例如,通過動態裝載。
- 3、為了避免建立一個與產品類層次平行的工廠類層次時。
- 4、當一個類的例項只能有幾個不同狀態組合中的一種時。建立相應數目的原型並克隆它們可能比每次用合適的狀態手工例項化該類更方便一些。
如何解決:利用已有的一個原型物件,快速地生成和原型物件一樣的例項。
關鍵程式碼:
- 1、實現克隆操作,在 JAVA 繼承 Cloneable,重寫 clone(),在 .NET 中可以使用 Object 類的 MemberwiseClone() 方法來實現物件的淺拷貝或通過序列化的方式來實現深拷貝。
- 2、原型模式同樣用於隔離類物件的使用者和具體型別(易變類)之間的耦合關係,它同樣要求這些"易變類"擁有穩定的介面。
應用例項:
- 1、細胞分裂。
- 2、JAVA 中的 Object clone() 方法。
優點:
- 1、效能提高。
- 2、逃避建構函式的約束。
缺點:
- 1、配備克隆方法需要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不一定很容易,特別當一個類引用不支援序列化的間接物件,或者引用含有迴圈結構的時候。
- 2、必須實現 Cloneable 介面。
使用場景:
- 1、資源優化場景。
- 2、類初始化需要消化非常多的資源,這個資源包括資料、硬體資源等。
- 3、效能和安全要求的場景。
- 4、通過 new 產生一個物件需要非常繁瑣的資料準備或訪問許可權,則可以使用原型模式。
- 5、一個物件多個修改者的場景。
- 6、一個物件需要提供給其他物件訪問,而且各個呼叫者可能都需要修改其值時,可以考慮使用原型模式拷貝多個物件供呼叫者使用。
- 7、在實際專案中,原型模式很少單獨出現,一般是和工廠方法模式一起出現,通過 clone 的方法建立一個物件,然後由工廠方法提供給呼叫者。原型模式已經與 Java 融為渾然一體,大家可以隨手拿來使用。
注意事項:與通過對一個類進行例項化來構造新物件不同的是,原型模式是通過拷貝一個現有物件生成新物件的。淺拷貝實現 Cloneable,重寫,深拷貝是通過實現 Serializable 讀取二進位制流。
自我總結
為了防止原物件資料被改變或者資源優化時使用,在java中有很多使用,通常有java工廠模式使用。
自己使用最多的是java 中 Object的克隆方法。。