原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。说白了就是将对象复制一遍,在将其赋给一个新的对象变量。由于这种方法太常用,所以.NET在System命名空间中提供了ICIoneable接口,其中就只有唯一的一个方法Clone(),实现了这个接口就可以完成原型模式。举个简单的例子:毕业找工作需要投递简历的,而复制则是一个非常方便的方法。转成代码则如下:
class Resume:ICloneable
{
private string name;
private string timeArea;
private string company;
public Resume(string name)
{
this.name=name;
}
public void SetWorkExperience(string timeArea,string company)
{
this.timeArea=timeArea;
this.company=company;
}
public void Display()
{
console.WriteLine("信息:{0} {1} {2}",name,timeArea,company);
}
//实现接口方法
Public Object Clone()
{
return (Object)this.MemberwiseClone();
}
}
在客户端代码调用如下
Resume a=new Resume("tom")
Resume b=(Resume)a.Clone(); //克隆对象a,赋值给对象b
a.Display();
b.Display();
在此在进行深化,有关浅复制和深复制,依个人理解:浅复制就是像上面一般的复制,复制的模板就一个实体,而深复制则是复制成为一个一个的实例。主要解决类中包含引用的问题。
像上面如果将属相timeArea和company拿出来组合成为一个单独的实例WorkExperience,则在类中Resume中只能引用这个WorkExperience类,而在复制的时候只是复制的引用而不是复制真实的对象。所造成的结果就是工作经历完全的一样。
解决方法就是通过深复制将工作经历类也复制一遍,就可得到一个具体的实例,如下:
class WorkExperience:ICloneable
{
private string timeArea;
private string company;
public string TimeArea
{
get {return timeArea;}
set {timeArea=value;}
}
public string Company
{
get {return company;}
set {company=value;}
}
public Object Clone()
{
return (Object)this.MemberwiseClone();
}
}
将简历类Resume中的Clone()方法中实例化简历,再将其他属性进行赋值即可。
通过深复制可得到的结果如下(工作经历不相同):
信息:大鸟 1996-2000xx公司
信息:大鸟 2000-2006yy公司