【大话设计模式】—— 原型模式

一、概念

  为了提高效率,我们经常会采用复制的方式,这样不用一点一点的从头开始进行(初始化新对象),直接利用结果就好(动态的获得对象运行时的状态)。

  前几天我做演讲的ppt,就有偷懒之嫌~ 把大家的优秀博客,截图然后copy到ppt当中,这样免去了重新构思这一环节,高质量(大家的功劳 O(∩_∩)O~),高效率。

  设计模式中也不乏类似功能的模式。原型模式便是其中之一。

  原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。不需要知道任何创建的细节。


二、UML图

客户(Client)对象:使用原型对象的客户程序

抽象原型(Prototype)对象:声明了克隆自身,且具体原型对象必须实现的接口(如果是深复制,必须有实现clone的规定)。

具体类型(ConcretePrototype)对象:从抽象原型派生而来,是客户程序使用的对象,即被复制的对象。此角色需要实现抽象原型角色所要求的接口,实现一个克隆自身的操作。

【大话设计模式】—— 原型模式_第1张图片


三、实例解析

  学习了设计模式之后,小M终于有了一份工作(满18了,木有非法使用童工。。)。为了获得更多推销自己的机会,她设计了一张自己的名片,包含的信息有:姓名 性别 年龄 电话。但是一张名片送人之后,就再也没有了,所以她通过原型模式又给自己copy了几张。


   //客户端代码
    class Program
    {
        static void Main(string[] args)
        {
            ConcreteBussinessCard bc = new ConcreteBussinessCard("小M");
            bc.SetPersonalInfo("女","18","12345678901");

            //克隆类ConcreteBussinessCard的对象bc就能得到新的实例bc1
            ConcreteBussinessCard bc1 = (ConcreteBussinessCard)bc.Clone();
            bc1.SetPersonalInfo("女", "18", "12345678901");

            bc.Display();
            bc1.Display();

            Console.Read();
          
           
        }
    }

    //抽象名片类
    abstract class BussinessCard
    {
        //定义名片包含信息:姓名,性别,年龄,电话号码为私有变量
        private string name;      
        private string sex;
        private string age;  
        private string phoneNumber; 


        //构造函数
        public BussinessCard(string name)
        {
            this.name = name;           
        }

        //设置个人信息
        public void SetPersonalInfo(string sex, string age,string phoneNumber)
        {
            this.sex = sex;
            this.age = age;
            this.phoneNumber = phoneNumber;
        }

        //显示
        public void Display()
        {
            Console.WriteLine("姓名:{0}  性别:{1}  年龄:{2}",name ,sex ,age );
            Console.WriteLine(" 电话:{0}",phoneNumber );

        }

        //关键是这里有一个Clone方法
        public abstract BussinessCard Clone();
        
    }



    //具体名片类
    class ConcreteBussinessCard : BussinessCard
    {
        public ConcreteBussinessCard(string name)
            : base(name)
        { }


        public override BussinessCard Clone()
        {
            return (BussinessCard)this.MemberwiseClone();//创建当前的浅表副本。
        }
    }

}


运行结果:

【大话设计模式】—— 原型模式_第2张图片

四、深复制和浅复制

  背景:MemberwiseClone()方法是这样,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。


【大话设计模式】—— 原型模式_第3张图片


浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。

深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。


五、总结

  原型模式能够简化代码,优化设计,让我们摆脱了手工抄写的时代。代码同样可以推动社会进步!


Ps:对深复制和浅复制的理解还很浅,看了一些大牛的博客,也不是很明白,期待大家的点拨!

你可能感兴趣的:(设计模式,原型模式,深复制和浅复制)