原型模式

来源:互联网 发布:阿里云计算技术架构 编辑:程序博客网 时间:2024/05/10 00:58

            原型模式也属于构建型设计模式,不多说了直接开始总结

原型模式


定义


  (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方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,通常对克隆所产生的对象进行修改对原型对象不会造成任何影响,每一个克隆对象都是相互独立的。通过不同的方式修改可以得到一系列相似但不完全相同的对象(来自网络)
  • 使用场景在需要重复地创建相似对象时可以考虑使用原型模式。在初始化的信息不发生变化的情况下,克隆是最好的办法。既隐藏了对象的创建细节,又对性能是大大的提高。

浅复制和深复制

  • 浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然只想原来的对象
  • 深复制:把引用对象的变量指向复制过得新对象,而不是原有的被引用的对象。

     自己的理解:数据类型分为值类型和引用类型,而深浅复制的区别就在于是否能够复制引用类型的成员变量,浅复制对于值类型没有问题,但是对于引用类型,就只是复制了原型引用类型的地址,原型和克隆对象的地址是相同的,引用还是指向了原来的对象

总结


今天总结的这个模式实现起来并不难,无非就是实现一个接口,重写一个方法,但是难就在与如何应用好这个模式,希望在以后实践中多多摸索





1 0