原型模式:
用原型实例指定要创建的对象的种类(可定制),并且通过拷贝这些原型来创建新的对象(不需要知道创建的细节)——提高性能,动态获得对象运行时的状态。
.NET在System命名空间中提供了ICloneable接口,唯一的方法Clone()克隆,因此只要实现该接口就可以完成原型模式,所以原型抽象类Prototype是不需要的。
结构图:
进一步探究这里还涉及到了深、浅复制的问题;
浅复制
是指被复制对象的所有变量都含有与原来的对象相同的值,简单一点说就是赋值,而所有的对其他对象的引用(传引用和传值DF的链接)都仍然指向原来的对象,只是复制了引用,这样容易出现问题:如有B浅复制了A的引用,如果A修改了资源,B处则会报错;
深复制
是把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。就是说深复制不仅复制了引用而且还复制了引用的对象,使得对象拥有了不同的资源(相同内容不同名字的新资源)对于堆资源来说,就是开辟了一块堆内存,把原有内容拷贝。这在下面的代码中也有体现。
代码实例:
class Resum : ICloneable
{
private string name;
private string sex;
private string age;
private WorkEeprience work;//引用“工作经历”对象
public Resum(string name)
{
this.name = name;
work = new WorkEeprience();//实例化简历时实例化工作经历
}
//私有构造函数,克隆工作经历数据
private Resum(WorkEeprience work)
{
this.work = (WorkEeprience)work.Clone();
}
//个人信息
public void SetPersonalInfo(string sex, string age)
{
this.sex = sex;
this.age = age;
}
//工作经历,调用次方法时给对象两个属性赋值
public void SetWorkExperience(string workDate, string company)
{
work.WorkDate = workDate;
work.Company = company;
}
public void Display()
{
Console.WriteLine("{0},{1},{2}", name, sex, age);
//实现接口IClone方法,克隆对象
Console.WriteLine("工作经历:{0}{1}", work.WorkDate, work.Company);
}
public object Clone()
{
//调用私有构造方法,让“工作经历”克隆完成
Resum obj = new Resum(this.work);
obj.name = this.name;
obj.sex = this.sex;
obj.age = this.age;
return obj;
}
}