大戰設計模式【23】—— 原型模式
原型模式(Prototype)
設計模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample
一、定義
使用原型實例指定創建對象的種類,並且通過拷貝這些原 型創建新的對象。原型模式是一種對象創建型模式。
二、結構
Prototype(抽象原型類):它是聲明克隆方法的接口,是所有具體原型類的公共父類,可以是抽象類也可以是接口,甚至還可以是具體實現類。
ConcretePrototype(具體原型類):它實現在抽象原型類中聲明的克隆方法,在克隆方法中返回自己的一個克隆對象
Client(客戶類):讓一個原型對象克隆自身從而創建一個新的對象,在客戶類中只需要直接實例化或通過工廠方法等方式創建一個原型對象,
再通過調用該對象的克隆方法即可得到多個相同的對象。由於客戶類針對抽象原型類Prototype編程,因此用戶可以根據需要選擇具體原型類,
系統具有較好的可擴展性,增加或更換具體原型類都很方便。
三、優點
當創建新的對象實例較為復雜時,使用原型模式可以簡化對象的創建過程,通過復制一個已有的實例可以提高新實例的創建效率。
可以使用深復制的方式保存對象的狀態。將對象復制一份並將其狀態保存起來,以便於在使用的時候使用,比如恢復到某一個歷史狀態,可以輔助實現撤銷操作。
四、缺點
需要為每一個類配備一個克隆方法,而且該克隆方法位於一個類的內部,當對已有的類進行改造時,需要修改源代碼,違背了開閉原則。
為了支持深復制,當對象之間存在多重嵌套引用關系時,每一層對象都必須支持深復制,實現起來可能比較麻煩。
五、應用場景
最主要的應用場景就在於創建新對象成本較大(例如初始化需要占用較長的時間,占用太多的CPU資源或者網絡資源),
新的對象可以通過原型模式對已有對象進行復制來獲得。如果是相似對象,則可以對其成員變量稍作修改。
六、個人總結
1、當你需要多個屬性相同的對象的時候,而且創建新對象的成本較大,需要請求外部資源等,就可以考慮原型模式
2、你可以理解成,原型模式就是克隆幾個相同的對象,或者是相似的對象只是稍作修改的情況
3、註意淺拷貝和深拷貝的區別
淺拷貝:對值類型的成員變量進行值的復制,對引用類型的成員變量只復制引用,不復制引用的對象.
深拷貝:對值類型的成員變量進行值的復制,對引用類型的成員變量也進行引用對象的復制.
參考博客:http://www.cnblogs.com/edisonchou/p/6798743.html
大戰設計模式【23】—— 原型模式