原型模式

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

   原型模式其实是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。

 1 abstract class Prototype
 2 {
 3      private string id;
 4      public string Id
 5      {
 6           get{return id;}
 7      }
 8 
 9      public Prototype(string id)
10      {
11              this.id = Id;
12      }
13 
14      public abstract Prototype Clone();
15 }
16 
17 
18 //具体原型类
19 class ConcreatePrototype: Prototype
20 {
21      public ConcreatePrototype(string id):base (id)
22      {}
23      public override Prototype Clone()
24      {
25           /*创建当前对象的浅表副本。方法是创建一个新对象,然后将当前对象的非静态字段复制到该对象。如果字段是值类型的,则对该对象执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此原始对象及其副本引用同一个对象*/
26           return (Prototype)this.MemberwiseClone();
27      }
28 }
View Code

克隆隐藏了对象创建的细节,同时大大的提高了性能。不用重新初始化对象,而是动态地获得对象运行时状体。

     MemberwiseClone()方法是这样的,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象;因此原始对象及其副本引用同一对象。

浅表复制:被复制对象的所有变量都含有原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。

深表复制:把引用对象的变量指向复制过来的新对象,而不是原来被引用的对象。

深表复制的实现:

  1、提供Clone方法调用的私有构造函数,以便克隆数据

  2、在克隆对象的方法中调用私有构造函数,浅表复制其他变量

实例:Dataset提供Clone和Copy方法,Clone是浅表复制,只复制数据结构;Copy既复制结构,也复制数据。

原文地址:https://www.cnblogs.com/qindy/p/10888741.html