原型模式

前言

  原型模式(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、深复制:把引用对象变量指向复制过的新对象,而不是原有的被引用的对象。

 

  参考书籍:大话设计模式

posted @ 2018-10-25 15:24  hyunbar  阅读(136)  评论(0编辑  收藏  举报