原型模式——用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式其实就是对.NET中拷贝的一个应用模式,拷贝表面意思就是将对象拷贝一份,由于.NET中有引用类型和值类型两种类型,所以也分为浅拷贝和深拷贝这两种概念。
先说下浅拷贝吧,在.NET中,引用类型会在创建时内存空间给动态分配一个内存。典型的引用类型就是创建一个对象,这个对象就是引用类型。当我们先实例化一个对象时,内存空间开辟一个空间存放这个对象。当再创建一个同类型的对象时,把先前创建的对象赋值给后创建的,也就是没执行new的操作,这是新创建的对象不会新开辟一个内存空间,而是把新对象指向原来对象的内存空间。这样就完成的浅拷贝的前提。
而深拷贝,不仅赋值了对象的值,还再内存中再次开辟了一个空间,这样就变成了两个互不干涉的对象了。
1.Person类,提供了一些属性和一些方法,当然最重要的时提供了一个Clone的方法来实现对自身的拷贝。
1 ///2 /// 定义一个Person类 3 /// 4 public class Person : ICloneable 5 { 6 private readonly string _word; 7 ///8 /// 构造方法传入人要说的话 9 /// 10 /// 要说的话11 public Person(string word)12 {13 _word = word;14 }15 ///16 /// 姓名17 /// 18 public string Name { get; set; }19 20 ///21 /// 年龄22 /// 23 public int Age { get; set; }24 25 ///26 /// 说话的方法27 /// 28 public void Say()29 {30 Console.WriteLine("{0},我叫{1},我{2}了", _word, Name, Age);31 }32 33 ///34 /// 浅拷贝的克隆方法35 /// 36 ///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的方法,每个实体类去继承这个抽象类,让后再新建一个管理类,每个实体类在管理类里面都有一个对象属性,那么管理类在上层就是通用的了,因为它包含了所有类的值。
以上内容部分参考程杰的《大话设计模式》一书