原型模式——用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式其实就是对.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 }
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 }
我觉得,原型模式在设计实体类的时候比较好用,在定义实体类的时候,由于属性过多有时会很烦恼,假如我们假如层次结构,各个对象都没有关联,用一个统一类来管理。
比如定义个抽象类,抽象类里面实现了Clone的方法,每个实体类去继承这个抽象类,让后再新建一个管理类,每个实体类在管理类里面都有一个对象属性,那么管理类在上层就是通用的了,因为它包含了所有类的值。
以上内容部分参考程杰的《大话设计模式》一书