原型模式
原型模式其实就是一个从一个对象再创建另一个可定制的对象,而且不需要知道任何创建细节,NET在System命名空间下,提供了ICloneable接口,实现这个接口完成原型模式。一般在初始化信息不变的时候,克隆是最好的办法。隐藏了创建对象的细节,性能也大大提高。MemberWiseClone(),复制仅仅对线程栈进行复制,是属于浅复制,要深复制,需要稍微修改代码。
结构图
一般人的简历是不变,需要多份,这个时候使用克隆模式比较好:
class Resume : ICloneable
{
private string name;
private string sex;
private string age;
private WorkExperience work;
public Resume(string name)
{
this.name = name;
this.work = new WorkExperience();
}
public Resume(WorkExperience work)
{
this.work = (WorkExperience)work.Clone();
}
public void SerPersonalInfo(string sex, string age)
{
this.sex = sex;
this.age = age;
}
public void SerWorkExperience(string timeArea,string company)
{
this.work.WorkDate = timeArea;
this.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;
}
//浅复制
//public object Clone()
//{
// return (object)this.MemberwiseClone();
//}
}
工作经验类:
class WorkExperience : ICloneable
{
public string WorkDate { get; set; }
public string Company { get; set; }
public Object Clone()
{
return (Object)this.MemberwiseClone();
}
}
主函数调用:
class Program
{
static void Main(string[] args)
{
Resume a = new Resume("刘明");
a.SerPersonalInfo("男","24");
a.SerWorkExperience("1998-2000","XXX公司");
Resume b = (Resume)a.Clone();
b.SerWorkExperience("1998-2000", "yyy公司");
Resume c = (Resume)a.Clone();
c.SerWorkExperience("1998-2000", "fff公司");
c.SerPersonalInfo("女","小丽");
a.Display();
b.Display();
c.Display();
Console.ReadKey();
}
}
我们再来思考下面的问题:
1.为什么需要Prototype模式?
引入原型模式的本质在于利用已有的一个原型对象,快速的生成和原型对象一样的实例。你有一个A的实例a:A a = new A();现在你想生成和car1一样的一个实例b,按照原型模式,应该是这样:A b= a.Clone();而不是重新再new一个A对象。通过上面这句话就可以得到一个和a一样的实例,确切的说,应该是它们的数据成员是一样的。Prototype模式同样是返回了一个A对象而没有使用new操作。
2.引入Prototype模式带来了什么好处?
可以看到,引入Prototype模式后我们不再需要一个与具体产品等级结构平行的工厂方法类,减少了类的构造,同时客户程序可以在运行时刻建立和删除原型。
3.Prototype模式满足了哪些面向对象的设计原则?