前言
原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
.NE在System命名空间中提供了ICloneable接口,其中就是唯一的一个方法Clone(),这样只需要实现这个接口就可以完成原型模式。
MemberwiseClone()方法:如果是值类型,则该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一对象。意思就是如果“简历”类中有对象引用,那么引用的对象数据是不会被克隆的。
一、工作经历类
1 /// <summary> 2 /// 1、工作经历类 3 /// 2、ICloneable支持克隆,即用与现有实例相同的值创建类的新实例。 4 /// </summary> 5 public class WorkExperience : ICloneable 6 { 7 public string WorkDate { get; set; } 8 public string Company { get; set; } 9 public object Clone() 10 { 11 //返回当前 System.Object 的浅表副本。 12 return this.MemberwiseClone(); 13 } 14 }
二、简历类
1 public class Resume : ICloneable 2 { 3 private string name; 4 private string sex; 5 private string age; 6 private WorkExperience work; 7 public Resume(string name) 8 { 9 this.name = name; 10 work = new WorkExperience(); 11 } 12 private Resume(WorkExperience work) 13 { 14 //提供Clone方法调用自己的私有构造函数,以便克隆“工作经历”的数据 15 this.work = (WorkExperience)work.Clone(); 16 } 17 //设置个人信息 18 public void SetPersonalInfo(string sex,string age) 19 { 20 this.sex = sex; 21 this.age = age; 22 } 23 //设置工作经历 24 public void SetWorkExperience(string workDate,string company) 25 { 26 work.WorkDate = workDate; 27 work.Company = company; 28 } 29 public void Display() 30 { 31 Console.WriteLine("{0} {1}{2}", name, sex, age); 32 Console.WriteLine("工作经历:{0}{1}", work.WorkDate, work.Company); 33 } 34 /// <summary> 35 /// 调用私有构造函数,让“工作经历”克隆完成,然后再给这个“简历”对象的相关字段赋值, 36 /// 最终返回一个深赋值的简历对象 37 /// </summary> 38 /// <returns></returns> 39 public object Clone() 40 { 41 Resume obj = new Resume(this.work); 42 obj.name = this.name; 43 obj.sex = this.sex; 44 obj.age = this.age; 45 return obj; 46 } 47 }
三、测试
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Resume a = new Resume("甜甜"); 6 a.SetPersonalInfo("女", "23"); 7 a.SetWorkExperience("2000-2003", "aa公司"); 8 a.Display(); 9 10 Resume b = (Resume)a.Clone(); 11 b.SetWorkExperience("2006-2010", "bb公司"); 12 b.Display(); 13 14 Console.ReadKey(); 15 } 16 }
总结:
1、浅复制:被复制的对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
2、深复制:把引用对象变量指向复制过的新对象,而不是原有的被引用的对象。
参考书籍:大话设计模式
来源:https://www.cnblogs.com/hyunbar/p/9850096.html