1、前言
有時候會出現這樣一個問題,細胞分裂,一般來說一個細胞就是一個類。分裂的時候我們只能new一個一個的出來,在這個數量相當大的情況下是不是感覺Crazy。咦,這時候你有必要了解一下原型模式。
2、定義
當程序中確定了所需要的通用類(細胞),但需要將具體類延遲到運行時才能確定,當你需要的類盡在他們的提供處理方式不一樣的時候原型模式就是很好的選擇。使用原型模式就不用new細胞類了我們可以通過克隆Clon來實現。克隆不是C#固有的屬性但是這依舊不能阻止你玩成這樣的操作。下面來看列子
/// <summary> /// kelong /// </summary> public abstract class CellsClon { public abstract object Clone(); } /// <summary> /// 細胞類 /// </summary> public class Cells:CellsClon { /// <summary> /// 姓名 /// </summary> public string ? Name { get; set; } /// <summary> /// 編碼 /// </summary> public string? Code { get; set; }=Guid.NewGuid().ToString(); /// <summary> /// 克隆方法 /// </summary> /// <returns></returns> public override object Clone() { return this.MemberwiseClone() ; } //調用 Cells cc = new(); cc.Name = "紅細胞——————————————————————"; var cc2 = cc.Clone() as Cells; Console.WriteLine(cc.Name+cc.Code); Console.WriteLine(cc2.Name+cc2.Code);
上面原型模式的運行結果爲(從運行結果可以看出,創建的兩個拷貝對象的Code屬性都是與原型對象Code屬性一樣的)。上面代碼實現的淺拷貝的方式,淺拷貝是指當對象的字段值被拷貝時,字段引用的對象不會被拷貝。例如,如果一個對象有一個指向字符串的字段,並且我們對該對象做了一個淺拷貝,那麼這兩個對象將引用同一個字符串,而深拷貝是對對象實例中字段引用的對象也進行拷貝,如果一個對象有一個指向字符串的字段,並且我們對該對象進行了深拷貝的話,那麼我們將創建一個對象和一個新的字符串,新的對象將引用新的字符串。也就是說,執行深拷貝創建的新對象和原來對象不會共享任何東西,改變一個對象對另外一個對象沒有任何影響,而執行淺拷貝創建的新對象與原來對象共享成員,改變一個對象,另外一個對象的成員也會改變。
原型模式的優點有:
- 原型模式向客戶隱藏了創建新實例的複雜性
- 原型模式允許動態增加或較少產品類。
- 原型模式簡化了實例的創建結構,工廠方法模式需要有一個與產品類等級結構相同的等級結構,而原型模式不需要這樣。
- 產品類不需要事先確定產品的等級結構,因爲原型模式適用於任何的等級結構
原型模式的缺點有:
- 每個類必須配備一個克隆方法
- 配備克隆方法需要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不一定很容易,特別當一個類引用不支持串行化的間接對象,或者引用含有循環結構的時候。
PS:清晨的雨露拍打着花瓣的額頭,不禁讓人低下頭輕嗅它的清香。遠遠望去,窗臺的茉莉花又回到了屬於它的往昔,花香瀰漫,婀娜妖嬈。城牆上參差的綠色也慢慢爬上了眉梢。