原型模式
[ Prototype ]
用原型实例指定创建对象的种类 , 并且通过拷贝这些原型创建新的对象。
原型模式其实就是从一个对象再创建另外一个可定制的对象 , 而且不需知道任何创建的细节
原型模式分为 : 浅拷贝 和 深拷贝
浅拷贝 : 值类型 会逐位复制 , 引用类型 则复制引用但不复制引用的对象 , 因此 原始对象及其复本引用同一对象。
深拷贝 : 把引用对象的变量指向复制过的新对象 , 而不是原有的被引用的对象。 必须实现 ICloneable 接口
源码:
class Work : ICloneable
{
private string _timeArea;
private string _company;
public string TimeArea {
set { _timeArea = value; }
get { return _timeArea; }
}
public string Company {
set { _company = value; }
get { return _company; }
}
#region ICloneable 成员
public object Clone()
{
return (object)this.MemberwiseClone();
}
#endregion
}
class Resume : ICloneable
{
private string _Name;
private string _Sex;
private string _Age;
private Work work;
public Resume(string name)
{
_Name = name;
work = new Work();
}
public Resume(Work work)
{
this.work = (Work)work.Clone(); 这里决定了深拷贝
}
// <summary>
// 设置个人信息
// </summary>
// <param name="sex"></param>
// <param name="age"></param>
public void SetPersonalInfo(string sex, string age)
{
_Sex = sex;
_Age = age;
}
// <summary>
// 设置工作经历
// </summary>
// <param name="timeArea"></param>
// <param name="company"></param>
public void SetWorkExperience(string timeArea, string company)
{
work.TimeArea = timeArea;
work.Company = company;
}
// <summary>
// 显示
// </summary>
public void Display()
{
Console.WriteLine("{0} {1} {2}",_Name,_Sex,_Age);
Console.WriteLine("工作经历: {0} {1}",work.TimeArea,work.Company);
}
public Object Clone()
{
Resume obj = new Resume(this.work);
obj._Age = this._Age;
obj._Name = this._Name;
obj._Sex = this._Sex;
return obj;
}
}
class Program
{
static void Main(string[] args)
{
Resume a = new Resume("小菜");
a.SetPersonalInfo("男","29");
a.SetWorkExperience("1998-2000","xx公司");
Resume b = (Resume)a.Clone();
b.SetWorkExperience("2000-2002", "yy公司");
Resume c = (Resume)a.Clone();
c.SetWorkExperience("2002-2010", "zz公司");
a.Display();
b.Display();
c.Display();
Console.ReadKey();
}
}