原型模式也属于构建型设计模式,不多说了直接开始总结
原型模式
定义
(Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
UML结构图
客户(Client)角色:调用原型对象的客户程序
抽象原型(Prototype)角色:规定了具体原型对象必须实现的接口
具体原型(ConcretePrototype):从抽象原型派生而来,是客户程序使用的对象,即被复制的对象。此角色需要实现抽象原型角色所要求的接口。
具体实例
- 1.简历类需要实现ICloneable接口,这个接口是命名空间提供的,他唯一的方法就是Clone()
- 2.简历类中有设置个人信息,工作经历,显示和clone的方法
- 3.克隆的目的,不是在于复制完全一样的内容,而是在于同类型的对象不用在重新实例化,就能创建出一个类型相同内容不同的对象,下边的例子,对象a,new了一次,之后b和c不用重新构造函数,就能创造出和a格式相同,但是工作经验不同的例子,提高了性能
class Resume:ICloneable //提供的ICloneable接口,其中唯一的方法就是clone
{
private string name;
private string sex;
private string age;
private string timeArea;
private string company;
public Resume(string name)
{
this.name = name;
}
//个人信息
public void SetPersonalInfo(string sex,string age)
{
this.sex = sex;
this.age = age;
}
//工作经验
public void SetWorkExperience(string timeArea,string company)
{
this.timeArea = timeArea;
this.company = company;
}
//显示
public void Display()
{
Console.WriteLine("{0} {1} {2}", name, sex, age);
Console.WriteLine("工作经验:{0} {1}", timeArea, company);//实现接口的方法用来实现对象
}
public object Clone()
{
return (object)this.MemberwiseClone();//对于实例化对象进行克隆,具体实现接口的方法
}
客户端:
static void Main(string[] args)
{
Resume a = new Resume("李子明"); //实例化一次对象,之后不用再NEW,就可以复制出一样的对象副本
a.SetPersonalInfo("男", "28");
a.SetWorkExperience("2008-2010", "X企业");
Resume b = (Resume)a.Clone();
b.SetWorkExperience("2010-2013", "Y企业");
Resume c = (Resume)a.Clone();
c.SetWorkExperience("2013-2015", "z企业");
a.Display();
b.Display();
c.Display();
优点和使用场景
- 优点:使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,通常对克隆所产生的对象进行修改对原型对象不会造成任何影响,每一个克隆对象都是相互独立的。通过不同的方式修改可以得到一系列相似但不完全相同的对象。(来自网络)
- 使用场景:在需要重复地创建相似对象时可以考虑使用原型模式。在初始化的信息不发生变化的情况下,克隆是最好的办法。既隐藏了对象的创建细节,又对性能是大大的提高。
浅复制和深复制
- 浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然只想原来的对象
- 深复制:把引用对象的变量指向复制过得新对象,而不是原有的被引用的对象。
自己的理解:数据类型分为值类型和引用类型,而深浅复制的区别就在于是否能够复制引用类型的成员变量,浅复制对于值类型没有问题,但是对于引用类型,就只是复制了原型引用类型的地址,原型和克隆对象的地址是相同的,引用还是指向了原来的对象
总结
今天总结的这个模式实现起来并不难,无非就是实现一个接口,重写一个方法,但是难就在与如何应用好这个模式,希望在以后实践中多多摸索