意图:使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。
//抽象原型
public abstract class Prototype{
public abstract void Fight();
public abstract void BegAlms();
public abstract Prototype Clone();
}
public class PrototypeOne : Prototype{
public override void Fight(){
....
}
public override void BegAlms(){
....
}
public override Prototype Clone(){
return (PrototypeOne)this.MemberwiseClone();
}
}
public class PrototypeTow : Prototype{
public override void Fight(){
....
}
public override void BegAlms(){
....
}
public override Prototype Clone(){
return (PrototypeTow)this.MemberwiseClone();
}
}
public class Client{
static void Main(){
var prototypeOne1 = new Prototype().Clone();
var prototypeOne2 = new Prototype().Clone();
var prototypeOne3 = new Prototype().Clone();
var prototypeTow1 = new Prototype().Clone();
var prototypeTow2 = new Prototype().Clone();
var prototypeTow3 = new Prototype().Clone();
prototypeOne1.Fight();
prototypeOne2.Fight();
}
}
MeMberwiseClone:创建一个浅表副本,具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到新对象。如果字段是值类型,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。
优点:简化了实例的创建结构。适用于任何的等级结构。
缺点:每个类必须有克隆方法。
使用场景:
类初始化需要消耗非常多的资源。
通过new产生一个对象需要非常繁琐的数据准备或访问权限。
一般和工厂方法模式一起出现,通过clone的方法创建一个对象,然后由工厂方法提供给调用者。