原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式其实是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
克隆隐藏了对象创建的细节,同时大大的提高了性能。不用重新初始化对象,而是动态地获得对象运行时状体。
MemberwiseClone()方法是这样的,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象;因此原始对象及其副本引用同一对象。
浅表复制:被复制对象的所有变量都含有原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
深表复制:把引用对象的变量指向复制过来的新对象,而不是原来被引用的对象。
深表复制的实现:
1、提供Clone方法调用的私有构造函数,以便克隆数据
2、在克隆对象的方法中调用私有构造函数,浅表复制其他变量
实例:Dataset提供Clone和Copy方法,Clone是浅表复制,只复制数据结构;Copy既复制结构,也复制数据。