码迷,mamicode.com
首页 > 其他好文 > 详细

浅谈原型模式

时间:2014-11-19 15:51:03      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   使用   sp   数据   

      近期菜鸟D在看《大话设计模式》,看到原型模式,有一点自己的想法,所以就记下来。

      老规矩,解释定义:

      用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

      Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。                          ——来自百度 

      由于感觉光看书不动手实践一下有点不靠谱,就按着自己的理解写了段代码,情景参照《大话设计模式》第9章,简历的复制。

代码如下:

//原型类实现接口ICloneable
public class Prototype : ICloneable
    {

        public string ID { get; private set; }

        public string Exp { get; set; }

        private Company company = new Company();

        public Prototype(string id)
        {
            ID = id;
        }

        public void SetExp(string exp)
        {
            Exp = exp;
        }

        #region 引用类型的拷贝

        //SetCompany是浅拷贝
        public void SetCompany(string address)
        {
            company.Address = address;
        }

        //SetCompany1是深拷贝
        public void SetCompany1(string address)
        {
            Company c = (Company)company.Clone();
            c.Address = address;
            company = c;
        }

        //在客户端拷贝原型时,p2没有调用构造函数,而是调用clone方法,其实就是将p2的地址指向了p1的地址,所以p2调用SetCompany时,也会将p1的company改变。p3也调用clone方法,但是p3在调用SetCompany1时,尽管也克隆了p1的company,但是将克隆后的company赋给自己,所以修改不会影响其他实例
        //原源码(大话设计模式P88)是通过在私有的构造函数中克隆WorkExperience,并将克隆体赋值给自己,从而产生区别
        //大话设计模式P87有深拷贝,浅拷贝的介绍
        //结合C++的知识,浅拷贝是将新对象的指针指向原有的对象,不再复制原有对象。深拷贝是将原有对象复制一个份,让新对象的指针指向复制后的地址
        //结合C#的知识,浅拷贝是新对象引用原有对象,内存中没有产生新的对象。深拷贝是在内存中开辟空间创建对象,并将原有对象的值复制,新对象引用内存中新产生的对象,只是与原有对象的值一致,和原有对象没有关系。
        #endregion

        public void Show()
        {
            Console.WriteLine("id:{0} exp:{1} company:{2}", ID, Exp, company.Address);
        }

        public object Clone()
        {
            return MemberwiseClone();
        }
    }

//公司类,也可以拷贝
public class Company : ICloneable
    {

        private string address;

        public string Address
        {
            get { return address; }
            set { address = value; }
        }

        public object Clone()
        {
            return MemberwiseClone();
        }
    }

//客户端
            Prototype p1 = new Prototype("1");
            p1.SetExp("半年经验");
            p1.SetCompany("世纪财富中心");
            //p1.Show();
            Prototype p2 = (Prototype)p1.Clone();
            p2.SetExp("1年经验");
            p2.SetCompany("帝国大厦");
            //p2.Show();
            Prototype p3 = (Prototype)p1.Clone();
            p3.SetCompany1("华尔街");
            //p3.Show();

            p1.Show();
            p2.Show();
            p3.Show();

            //执行客户端的注释代码会发现有不同的结果,所以代码的执行逻辑也必须要理清

      应用的场景:

      从代码角度来说,避免创建对象时的初始化过程(如果这个过程占用的时间和资源都非常多),或者是希望避免使用工厂方法来实现多态的时候,可以考虑原型模式。

  从应用角度来说, 如果你创建的对象是多变化、多等级的产品,或者产品的创建过程非常耗时的时候(比如,有一定的计算量,或者对象创建时需要从网络或数据库中获取一定的数据),或者想把产品的创建独立出去,不想了解产品创建细节的时候可以考虑使用。

     注意事项:

     深拷贝和浅拷贝的使用。

     拷贝原型并进行修改意味着原型需要公开更多的数据,对已有系统实现原型模式可能修改的代价比较大。

附图:

bubuko.com,布布扣

部分内容摘自   http://www.cnblogs.com/promise-7/archive/2012/06/01/2530734.html

菜鸟D希望这篇文章对您有所帮助。

浅谈原型模式

标签:style   blog   http   io   ar   color   使用   sp   数据   

原文地址:http://www.cnblogs.com/cnDqf/p/4108266.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!