1.意图
将已经生成的实例复制到新的实例中。
2.使用场合
当一个系统应该独立于产品的创建、构建和表示时,可以使用原型模式。
3..NET实现
3.1. ICloenable接口
.NET已经为实现提供了必要的基础,即System命名空间中的ICloneable接口。这个接口只有Clone这一个方法。
3.2. 实现结构
//为引用对象负值
Brother b = new Brother("5430b", "AdaBirkin");
u.MyBrother = b;
u.DS=InitDS();
//执行复制
User newu = (User)u.Clone();
//因为这里是浅复制所以一旦u中的引用对象改变,也将应向到newu中的引用对象的值。
3.3.深复制与浅复制
深复制:如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。
浅复制:与浅复制的区别在于引用对象的复制。深复制是复制一个结构和数据与原字段相同的新实例,而不是复制字段的引用。
MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。
3.4..NET中的原型模式
.NET中的很多支持原型模式。
DataSet newds=ds.Clone();
注意,与数据有关的类还有一个方法Copy。与Clone不同,该方法不仅复制对象的结构,还复制对象中包含的数据。例如希望复制数据集中的结构和数据DataSet newds=ds.Copy();
使用Clone时还需要注意是深复制还是浅复制。.NET中实现的IClone接口的类基本上都是浅复制。深复制需要开发人员自己实现。
4.相关模式
工厂方法:在.NET中ICloneable接口定义了一个工厂方法——Clone,每个实现这个接口的类实际上是一个创建自身对象的具体工厂。
抽象工厂:原型模式使抽象工厂可以动态组装,通过改变原型获得不同类型的产品,在这种情况下可以减少抽象工厂的类层次。