原型模式(Prototype)

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     }
View Code

简历类:

 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     }
View Code

客户端调用:

 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     }
View Code

 

posted on 2015-12-02 22:37  HandyWang  阅读(188)  评论(0编辑  收藏  举报

导航