一、定义
使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。原型模式是一种创建型模式。
二、描述
包含以下三个角色:
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();
深克隆有很多种方法:序列化、二进制流、反射等。
三、总结
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容