前言
原型模式(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、深复制:把引用对象变量指向复制过的新对象,而不是原有的被引用的对象。
参考书籍:大话设计模式