原型模式
Prototype:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 。属于创建型模式。
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不许知道任何创建的细节。
原型模式结构图
原型模式适用的场景
当一个系统应该独立于它的产品创建、构成和表示时,要使用Prototype模式;以及
当要实例化的类是在运行时刻指定时,例如,通过动态装载;
为了避免创建一个与产品类层次平行的工厂类层次时;
当一个类的实力只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆他们可能比每次用合适的状态手工实例化该类更方便一些。
浅复制和深复制
浅复制:被复制对象的所有变量都含有与原来相同的值,而所有的对其他对象的引用都仍然指向原来的对象。比如要创建3个对象,我们复制时一变二,二是二,最后一变三,二变三,三是三,即最后所赋值。
深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。比如由要创建3个对象,我们复制时就一变二,二变三。
大话中简历复印的深复制实现类图
代码实现
class WorkExprerience:ICloneable //让“工作经历”实现ICloneable接口
{
private string workDate;
public string WorkDate
{
get { return workDate; }
set { workDate = value; }
}
private string company;
public string Company
{
get { return company; }
set { company = value; }
}
public Object Clone()//“工作经历”类实现克隆方法
{
return (Object)this.MemberwiseClone();
}
}
class Resume : ICloneable
{
private string name;
private string sex;
private string age;
private WorkExprerience work;//引用"工作经历"对象
public Resume(string name)
{
this.name = name;
work = new WorkExprerience();//在“简历”类实例化时同时实例化“工作经历”
}
private Resume(WorkExprerience work)
{
this.work = (WorkExprerience )work.Clone();//提供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);
Console.WriteLine("工作经历:{0}{1}", work.WorkDate, work .Company );
}
public Object Clone()
{
Resume obj = new Resume(this.work);//调用私有的构造方法,让“工作经历”克隆完成,然后再给这个就“简历”对象的相关字段赋值,最终返回一个深复制的简历对象
obj.name = name;
obj.sex = sex;
obj.age = age;
return obj;
}
}
客户端代码
static void Main(string[] args)
{
Resume a = new Resume("大鸟");
a.SetPersonalInfo("男", "29");
a.SetWorkExperience ("1998-2000", "XX公司");
Resume b =( Resume)a.Clone () ;
b.SetWorkExperience ("1998-2006", "YY公司");
Resume c = (Resume)a.Clone ();
c.SetPersonalInfo("男", "24");
c.SetWorkExperience("1998-2003", "ZZ企业");
a.Display();
b.Display();
c.Display();
Console.Read();
}
对此了解甚浅,望各位大侠指点