原型模式
原型概念:原型是指将产品概念形象化的产物。是用来确认需求或不确定性的,也可用作最终产品形态的参照物。
原型模式就是仿佛是一个模板(当然这个模板是自己写的),里面的内容我们可以根据自己的需求添加。并且既然是模板,便可以多次应用。
原型模型的特点只有一个——可以多次应用,虽然模型内的内容可以改变,但是生产出来的东西形状是不变的。
就像从一个模子里烤出来的不同味道的饼干,虽然形状一样,但是味道确实不同。
原型模式中的关键方法
MemberwiseClone()
这个方法一般的用法是:this.MemberwiseClone() ,该方法的作用是创建一个副本,将作为模板的类中的非静态字段复制到这个副本中。
如果该字段是值类型(string、double、int…)则对该字段执行逐位复制(一个一个复制)。如果该字段是引用类型(类…),则复制被引用的对象(原始对象)但不复制引用的对象。因此原始对象及其副本引用同一对象。
当我们的copy一个原型的时候,如果该原型中有调用其他类的值得时候,其他类中的值将不会将被copy到新的副本中,而被copy到的值只有原型本类中的值。
在上面的第一张图中可以看到,Resume类不继承WorkExperience类,所以当用clone()方法克隆a的时候,本类中的值能被复制到MemberwiseClone()创建的副本中,而Work.WorkDate这类(引用类型值)从别的类中调用的值不能被复制到该新的副本中。
所以在克隆到新的实例之后,能更改的只有本类中的值(值类型)。
ICloneable接口
这个接口是一个简单的用于复制的接口。使用接口之后,便可以不用再父类中定义虚方法Clone()。这样方便我们应用克隆方法。
原型模式例子
第一步
父类原型:该原型是所有具体运行的共同点。像是一个模型的雏形,还未经打磨
abstract class Prototype
{
public Prototype(string name )
{
this.Name = name;
}
private string name ;
public string Name
{
get { return name; }
set { name = value; }
}
public abstract Prototype Clone();
}
第二步
具体原型:该原型继承父类原型,可以看做父类原型的一个分支,可以为多个。具体原型为有效原型,可以说是完工的模型;
在具体原型中调用MemberwiseClone (),用来克隆该原型。
class one : Prototype
{
public one (string name) : base(name)
{
}
public override Prototype Clone()
{
return (Prototype)this.MemberwiseClone ();
}
}
客户端代码
one one = new one("小明");
one a = (one)one.Clone();
a.Name = "小刚";
string onestr = one.Name;
string astr = a.Name;
Console.WriteLine ("one{0},a{1}", onestr , astr);
Console.ReadKey();