标签:
1.原型模式涉及到两个重要概念:浅复制、深复制
①.所谓浅复制,针对值类型,是逐位复制(即连同值一起复制),而对于引用类型,则只复制对对象的引用(即只是获得了该对象的另一个指针),不会复制对象中的变量,需要说明的是,string类型是具有值类型特性的引用类型,即:虽然按照上述定义浅复制下只复制了引用,但对于string却是连同值都复制了,需要注意
②.所谓深复制,就是无论值类型还是引用类型,所有变量都复制了
2.原型模式实现了对象的复制,这在一些场合下是能提高效率的,比如:对象的创建过程回去调用构造函数,如果这个构造函数中需要执行很多操作,无疑就对执行效率有了较大影响,同时考虑:大多数初始化信息应该都是一致的,这是使用原型模式去创建统一结构的对象,之后再针对个性化信息做些修改,对效率将是大大的提高(同时,统一的信息部分也避免了出错)。
3.由于原型模式的通用性,.net下对其进行了封装,只要类实现ICloneable接口,该类对象既可以实现复制--浅复制,但基于浅复制深复制的概念,有可能会对复制结果造成预期外的结果:因为类中可能会有引用类型,这种情况下对其的复制只是引用(浅复制),之后对副本的个性化修改实际是修改了原对象!
举例如下:
简历中会涉及工作经历,工作经历大致有年限、公司信息,把这个工作经历提取成单独的类,而简历只是维护了对这个工作经历的引用,这时对简历的复制,工作经历部分就只是复制了引用,之后如果修改工作经历的内容,实际是修改了所有简历的工作经历,因为引用是同一个,解决方案便是多层克隆:
工作经历类:
1 class WorkExperience : ICloneable 2 { 3 public string WorkDate { get; set; } 4 public string WorkCompany { get; set; } 5 6 public object Clone() 7 { 8 return this.MemberwiseClone(); 9 } 10 }
简历类:
1 class Resume : ICloneable 2 { 3 private string name; 4 private string sex; 5 private int age; 6 private string timeArea; 7 private string company; 8 9 public Resume(string name) 10 { 11 this.name = name; 12 } 13 14 /// <summary> 15 /// 初始化个人信息 16 /// </summary> 17 public void SetPersonalInfo(int age, string sex) 18 { 19 this.age = age; 20 this.sex = sex; 21 } 22 23 /// <summary> 24 /// 初始化工作经历 25 /// </summary> 26 public void SetWorkInfo(string timeArea, string company) 27 { 28 this.timeArea = timeArea; 29 this.company = company; 30 } 31 32 /// <summary> 33 /// 展示个人简历 34 /// </summary> 35 public void Display() 36 { 37 Console.WriteLine("{0},{1},{2},{3}工作于{4}", this.name, sex, age, timeArea, company); 38 } 39 40 /// <summary> 41 /// 克隆(浅复制)方法 42 /// </summary> 43 /// <returns></returns> 44 public object Clone() 45 { 46 return this.MemberwiseClone(); 47 } 48 }
客户端调用:
1 /// <summary> 2 /// 原型模式 3 /// </summary 4 class Program 5 { 6 static void Main(string[] args) 7 { 8 Resume r1 = new Resume("大鸟"); 9 r1.SetPersonalInfo("男", "27"); 10 r1.SetWorkExperience("2011.11~2013.12", "百度公司"); 11 12 Resume r2 = (Resume)r1.Clone(); 13 r2.SetWorkExperience("2013.12~2014.12", "腾讯公司"); 14 15 r1.Display(); 16 r2.Display(); 17 18 Console.Read(); 19 } 20 }
标签:
原文地址:http://www.cnblogs.com/baweier2013/p/5014579.html