概念
原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.原型模式就是从一
个对象再创建另一个可定制的对象,而且不需要任何创建细节。.NET在System命名空间中提供了ICloneable接口,其
中唯一的方法Clone(),实现这个接口就可以 完成原型模式了。
UML图
实战代码
<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace 原型模式
{
class Program
{
static void Main(string[] args)
{
Resume a = new Resume("阿杰");
a.SetPersonalInfo("男", "23");
a.SetWorkExperience("2011-2012", "XX公司");
Resume b = (Resume)a.Clone(); //调用clone方法实现简历更新,并且可以再修改简历的细节
b.SetWorkExperience("2012-2013", "YY公司");
Resume c = (Resume)a.Clone();
c.SetPersonalInfo("男", "22");
a.Display();
b.Display();
c.Display();
Console.Read();
}
}
//工作经历
class WorkExperience : 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 WorkExperience work;
public Resume (string name)
{
this.name = name;
work = new WorkExperience();
}
private Resume (WorkExperience work)
{
this.work = (WorkExperience)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);
Console.WriteLine("工作经历:{0} {1}", work.WorkDate, work.Company);
}
public Object Clone()
{
Resume Obj = new Resume(this.work);
Obj.name = this.name;
Obj.sex = this.sex;
Obj.age = this.age;
return Obj;
}
}
}
</span>
实战结果
浅复制和深复制
如果字段是值类型,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象,因此原
始对象及其复本引用同一对象。也就是说浅复制只是复制的引用(地址)而不复制值,深复制复制的是值。
深复制的实现
通过调用私有的构造函数实现深复制。
小结
一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。通过原型模式,利用Clone实现了代码和功能的复用,减少了相同功能代码的冗余,提高了代码的质量。