設計模式之原型模式
阿新 • • 發佈:2018-08-12
name 原形 ace pre 我們 指定 通過 值類型 常常
1、需要為每一個類配置一個克隆方法,而且該克隆方法位於類的內部,當對已有類進行改造的時候,需要修改代碼。
2、在實現深克隆時需要編寫較為復雜的代碼,而且當對象之間存在多重簽到引用時,為了實現深克隆,每一層對象對應的類都必須支持深克隆,實現起來會比較麻煩。
原型模式(Prototype Pattern):用原型實例指定創建對象的種類,並且通過復制這些原型創建新的對象。
作用(解決的問題):簡化對象的創建過程。
優點:
1、當創建對象的實例較為復雜的時候,使用原型模式可以簡化對象的創建過程,通過復制一個已有的實例可以提高實例的創建效率。
2、擴展性好,由於原型模式提供了抽象原型類,在客戶端針對抽象原型類進行編程,符合開閉原則。
3、原型模式提供了簡化的創建結構,工廠方法模式常常需要有一個與產品類等級結構相同的工廠等級結構,而原型模式不需要這樣,
原形模式中產品的復制是通過封裝在類中的克隆方法實現的,無需專門的工廠類來創建產品。
4、可以使用深克隆方式保存對象的狀態,使用原型模式將對象復制一份並將其狀態保存起來,以便在需要的時候使用(例如恢復到歷史某一狀態)。
缺點:
1、需要為每一個類配置一個克隆方法,而且該克隆方法位於類的內部,當對已有類進行改造的時候,需要修改代碼。
2、在實現深克隆時需要編寫較為復雜的代碼,而且當對象之間存在多重簽到引用時,為了實現深克隆,每一層對象對應的類都必須支持深克隆,實現起來會比較麻煩。
實現:
/// <summary> /// 克隆接口 /// </summary> /// <typeparam name="T"></typeparam> public interface Prototype<T> { T Clone(); }/// <summary> /// 實現類 /// </summary> public class ConcretePrototype : Prototype<ConcretePrototype> { public ConcretePrototype Clone() { return (ConcretePrototype)this.MemberwiseClone(); } }
原型模式說白了就是克隆,不用想的太復雜,定義一個克隆接口,然後去實現就可以了。我們唯獨需要註意的是深度復制和淺度復制的問題。
淺度復制:值類型復制一份數據出來,引用類型只會復制地址,也就是說淺度復制後,母體和克隆體裏面的引用類型數據會指向同一個實體。
深度復制:值類型復制一份數據出來,引用類型會生成一個新的實體,和母體的數據保持一致。雖然母體和克隆體引用類型數據是一樣的,但是是兩個不同的實體。
設計模式之原型模式