设计模式——原型模式

  原型模式——用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

  原型模式其实就是对.NET中拷贝的一个应用模式,拷贝表面意思就是将对象拷贝一份,由于.NET中有引用类型和值类型两种类型,所以也分为浅拷贝和深拷贝这两种概念。

  先说下浅拷贝吧,在.NET中,引用类型会在创建时内存空间给动态分配一个内存。典型的引用类型就是创建一个对象,这个对象就是引用类型。当我们先实例化一个对象时,内存空间开辟一个空间存放这个对象。当再创建一个同类型的对象时,把先前创建的对象赋值给后创建的,也就是没执行new的操作,这是新创建的对象不会新开辟一个内存空间,而是把新对象指向原来对象的内存空间。这样就完成的浅拷贝的前提。

  而深拷贝,不仅赋值了对象的值,还再内存中再次开辟了一个空间,这样就变成了两个互不干涉的对象了。

1.Person类,提供了一些属性和一些方法,当然最重要的时提供了一个Clone的方法来实现对自身的拷贝。

 1 /// <summary>
 2 /// 定义一个Person类
 3 /// </summary>
 4 public class Person : ICloneable
 5 {
 6     private readonly string _word;
 7     /// <summary>
 8     /// 构造方法传入人要说的话
 9     /// </summary>
10     /// <param name="word">要说的话</param>
11     public Person(string word)
12     {
13         _word = word;
14     }
15     /// <summary>
16     /// 姓名
17     /// </summary>
18     public string Name { get; set; }
19 
20     /// <summary>
21     /// 年龄
22     /// </summary>
23     public int Age { get; set; }
24 
25     /// <summary>
26     /// 说话的方法
27     /// </summary>
28     public void Say()
29     {
30         Console.WriteLine("{0},我叫{1},我{2}了", _word, Name, Age);
31     }
32     
33     /// <summary>
34     /// 浅拷贝的克隆方法
35     /// </summary>
36     /// <returns></returns>
37     public object Clone()
38     {
39         //进行浅拷贝的方法
40         var wiseClonePerson = MemberwiseClone();
41         return wiseClonePerson;
42     }
43 }
Person.cs

2.客户端代码,创建一个Person对象并赋值,然后新建一个对象并且调用Clone方法。这时候新person会有第一person的属性值和方法,做同样的事。

 1 static void Main(string[] args)
 2 {
 3     var person = new Person("Hello world");
 4     person.Name = "张三";
 5     person.Age = 17;
 6     person.Say();
 7     var person1 = (Person)person.Clone();
 8     person1.Say();
 9     Console.ReadKey();
10 }
Program.cs

  我觉得,原型模式在设计实体类的时候比较好用,在定义实体类的时候,由于属性过多有时会很烦恼,假如我们假如层次结构,各个对象都没有关联,用一个统一类来管理。

比如定义个抽象类,抽象类里面实现了Clone的方法,每个实体类去继承这个抽象类,让后再新建一个管理类,每个实体类在管理类里面都有一个对象属性,那么管理类在上层就是通用的了,因为它包含了所有类的值。

                                                          以上内容部分参考程杰的《大话设计模式》一书

 

posted @ 2013-05-25 16:07  Kitten Zhang  阅读(151)  评论(0编辑  收藏  举报