【大话设计模式读书笔记——原型模式】
原型模式
原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。
原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。
/// <summary>
/// 简历类
/// </summary>
public class Resume : ICloneable
{
private string name;
private string sex;
private int age;
private WorkExperience workExperience;
public Resume(string name)
{
this.name = name;
workExperience = new WorkExperience();
}
private Resume(WorkExperience workExperience)
{
this.workExperience = (WorkExperience)workExperience.Clone();
}
/// <summary>
/// 设置个人信息
/// </summary>
/// <param name="sex"></param>
/// <param name="age"></param>
public void SetPersonInfo(string sex,int age)
{
this.sex = sex;
this.age = age;
}
/// <summary>
/// 设置工作经验
/// </summary>
/// <param name="workDate"></param>
/// <param name="company"></param>
public void SetWorkExperience(string workDate, string company)
{
workExperience.WorkDate = workDate;
workExperience.Company = company;
}
/// <summary>
/// 显示
/// </summary>
public void Display()
{
Console.WriteLine("{0} {1} {2}",name,sex,age);
Console.WriteLine("工作经历 {0} {1}", workExperience.WorkDate, workExperience.Company);
}
/// <summary>
/// 一般在初始化信息不可发生变化的情况下,克隆是最好的办法。这即隐藏了对象创建的细节,又对性能是大大的提高。
/// </summary>
/// <returns></returns>
public object Clone()
{
//MemberwiseClone:返回当前对象的浅表副本(它是Object对象的基方法)
// return this.MemberwiseClone();//浅度复制:如果字段是值类型的,则对字段执行逐位的复制。如果字段是引用类型,则复制引用但不复制对象。因此,原始对象及其副本对象为同一对象。
Resume obj = new Resume(workExperience);
obj.name = name;
obj.age = age;
obj.sex = sex;
return obj;
}
}
/// <summary>
/// 工作经历
/// </summary>
public class WorkExperience: ICloneable
{
public string WorkDate { get; set; }
public string Company { get; set; }
public object Clone()
{
return this.MemberwiseClone();// 浅拷贝
}
}
//浅复制:被复制的对象所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象
//深复制:把引用对象的变量指向复制过的新对象,而不是原来的被引用对象。
Resume b = (Resume)a.Clone();
b.SetPersonInfo("男", 30);
b.SetWorkExperience("1998-20001", "BBB公司");
Resume c = (Resume)a.Clone();
c.SetPersonInfo("男", 31);
c.SetWorkExperience("1998-20002", "CCC公司");
a.Display();
b.Display();
c.Display();
输出:
大鸟 男 29
工作经历 1998-2000 AAA公司
大鸟 男 30
工作经历 1998-20001 BBB公司
大鸟 男 31
工作经历 1998-20002 CCC公司