找回密码
 立即注册
首页 业界区 业界 设计模式(五)原型

设计模式(五)原型

溶绚 昨天 01:44
一、定义

使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。原型模式是一种创建型模式。
二、描述

包含以下三个角色:
1.png
1、Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至可以是具体实现类。
2、ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
3、Client(客户类):在客户类中,让一个原型对象克隆自身从而创建一个新的对象,只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体原型类,系统具有较好的可扩展性,增加或更换具体原型类都很方便。
三、例子

X公司在使用OA系统时发现,某些岗位员工的每周周报及其相似,为了提高写周报的效率,大家迫切希望有一种功能可以快速创建相同或者相似的周报,包括附件,使用原型模式对周报创建模块进行改进。
2.png
WeeklyLog、Attachment:周报类、附件类,实际业务较为复杂,示例简化只列出部分属性
  1. public class WeeklyLog
  2. {
  3.     public string Name { get; set; }
  4.     public string Date { get; set; }
  5.     public string Content { get; set; }
  6.     public Attachment Attachment { get; set; }
  7.     public WeeklyLog Clone()
  8.     {
  9.         return this.MemberwiseClone() as WeeklyLog;
  10.     }
  11.     public WeeklyLog CloneDeep()
  12.     {
  13.         return JsonSerializer.Deserialize<WeeklyLog>(JsonSerializer.Serialize(this));
  14.     }
  15. }
  16. public class Attachment
  17. {
  18.     public string Name { get; set; }
  19. }
复制代码
Program:测试代码
  1. Console.WriteLine("浅克隆");
  2. WeeklyLog log_previous, log_new;
  3. log_previous = new WeeklyLog();
  4. log_previous.Attachment = new Attachment();
  5. log_new = log_previous.Clone();
  6. Console.WriteLine("周报是否相同:{0}", (log_previous == log_new ? "是" : "否"));
  7. Console.WriteLine("附件是否相同:{0}", (log_previous.Attachment == log_new.Attachment ? "是" : "否"));
  8. Console.WriteLine("深克隆");
  9. log_new = log_previous.CloneDeep();
  10. Console.WriteLine("周报是否相同:{0}", (log_previous == log_new ? "是" : "否"));
  11. Console.WriteLine("附件是否相同:{0}", (log_previous.Attachment == log_new.Attachment ? "是" : "否"));
  12. Console.ReadLine();
复制代码
深克隆有很多种方法:序列化、二进制流、反射等。
3.png

三、总结


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册