##一、定義 **使用原型實例指定待創建對象的類型,並且通過複製這個原型來創建新的對象。原型模式是一種創建型模式。** ##二、描述 **包含以下三個角色:** ![](https://img2023.cnblogs.com/blog/1780813/202305/1780813-202305271 ...
一、定義
使用原型實例指定待創建對象的類型,並且通過複製這個原型來創建新的對象。原型模式是一種創建型模式。
二、描述
包含以下三個角色:
1、Prototype(抽象原型類):它是聲明克隆方法的介面,是所有具體原型類的公共父類,可以是抽象類也可以是介面,甚至可以是具體實現類。
2、ConcretePrototype(具體原型類):它實現在抽象原型類中聲明的克隆方法,在克隆方法中返回自己的一個克隆對象。
3、Client(客戶類):在客戶類中,讓一個原型對象克隆自身從而創建一個新的對象,只需要直接實例化或通過工廠方法等方式創建一個原型對象,再通過調用該對象的克隆方法即可得到多個相同的對象。由於客戶類針對抽象原型類Prototype編程,因此用戶可以根據需要選擇具體原型類,系統具有較好的可擴展性,增加或更換具體原型類都很方便。
三、例子
X公司在使用OA系統時發現,某些崗位員工的每周周報及其相似,為了提高寫周報的效率,大家迫切希望有一種功能可以快速創建相同或者相似的周報,包括附件,使用原型模式對周報創建模塊進行改進。WeeklyLog、Attachment:周報類、附件類,實際業務較為複雜,示例簡化只列出部分屬性
public class WeeklyLog
{
public string Name { get; set; }
public string Date { get; set; }
public string Content { get; set; }
public Attachment Attachment { get; set; }
public WeeklyLog Clone()
{
return this.MemberwiseClone() as WeeklyLog;
}
public WeeklyLog CloneDeep()
{
return JsonSerializer.Deserialize<WeeklyLog>(JsonSerializer.Serialize(this));
}
}
public class Attachment
{
public string Name { get; set; }
}
Program:測試代碼
Console.WriteLine("淺克隆");
WeeklyLog log_previous, log_new;
log_previous = new WeeklyLog();
log_previous.Attachment = new Attachment();
log_new = log_previous.Clone();
Console.WriteLine("周報是否相同:{0}", (log_previous == log_new ? "是" : "否"));
Console.WriteLine("附件是否相同:{0}", (log_previous.Attachment == log_new.Attachment ? "是" : "否"));
Console.WriteLine("深克隆");
log_new = log_previous.CloneDeep();
Console.WriteLine("周報是否相同:{0}", (log_previous == log_new ? "是" : "否"));
Console.WriteLine("附件是否相同:{0}", (log_previous.Attachment == log_new.Attachment ? "是" : "否"));
Console.ReadLine();
深克隆有很多種方法:序列化、二進位流、反射等。