C#设计模式(6)——原型模式(Prototype Pattern) – Learning hard

一、小引

在软件零碎中,准备类包围的转换是奢侈的或复杂的。,我们的必要准备这么人家类的多个包围。,条件我们的应用new运算符准备此类类包围,这将补充节准备类和耗费更多内存的复合物。,由于这么,类包围的多个包围被分派在,话说回来,条件厂子模式被用来准备这么的零碎,,跟随条的补充节,子集的量子正补充节。,它补充节了零碎的复合物。,这么,应用厂子模式封装类准备P是不合适的的。,除了原型模式可以好的地处理这事问题,由于每个类包围都是两者都的。,当我们的必要同人家类的多个包围时,不用每回应用新手柄符来准备两者都的CL。,在这点上,我们的的普通思惟是只准备人家类包围反对。,条件后来必要更多的榜样,可以经过完全一样的原始反对的副原来是准备复本。,这么,就不用要在同一类中准备多个包围。,因此增加内存的耗费和跑到类包围的复用。 除了这事思绪只有原型模式的获得办法。下面是对原型设计模式的特别的绍介。。

二、原型模式的特别的绍介

在实际生活中,原型设计模式也有很多榜样。,比如,细胞分裂转换,人家细胞的核分裂发生两个两者都的细胞。;在《西游记》中,孙武空用于加强语气孙孙和Narut的容量。下面就以孙悟空为榜样来演示下原型模式的获得。详细获得密码如次:

///火影忍者中鸣人的影分身和孙悟空的的变都是原型模式class Client
    {
        staticvoid Main(string[] ARGS)
        {
            // 孙悟空 原型
            MonkeyKingPrototype prototypeMonkeyKing = new ConcretePrototype("MonkeyKing");

            // 换一
            MonkeyKingPrototype cloneMonkeyKing = () as ConcretePrototype;
            ("Cloned1:\t"+);

            // 变两个
            MonkeyKingPrototype cloneMonkeyKing2 = () as ConcretePrototype;
            ("Cloned2:\t" + );
            ();
        }
    }

    ////// 孙武空原型
    ///publicabstractclass MonkeyKingPrototype
    {
        publicstring Id { get; set; }
        public MonkeyKingPrototype(string 身份证)
        {
            this.Id = id;
        }

        // 机器人办法,孙大胜说用于加强语气。publicabstract MonkeyKingPrototype Clone();
    }

    ////// 准备特派原型
    ///publicclass ConcretePrototype : MonkeyKingPrototype
    {
        public ConcretePrototype(string 身份证)
            : base(身份证)
        { }

        ////// 浅拷贝
        //////publicoverride MonkeyKingPrototype Clone()
        {
            // MulnisteCon办法是浅拷贝。,也有很深的完全一样的品。return (MonkeyKingPrototype)this.MemberwiseClone();
        }
    }

下面原型模式的运转树或花草结果为(从运转树或花草结果可以看出,准备的两个完全一样的反对的ID属性与ID ATTILB两者都。:

在上述的密码中获得浅拷贝的办法。,浅拷贝是指当反对的运动场值被完全一样的时。,该运动场援用的反对将不被完全一样的。。比如,条件反对具有削尖字母行的运动场,我们的用于加强语气了人家浅拷贝的反对。,这两个反对将由同人家字母行援用。,吃水复本也Object中运动场援用的反对的复本。,条件反对具有削尖字母行的运动场,我们的做了人家深入的完全一样的反对。,话说回来,我们的将准备人家反对和人家新的字母行。,新反对将援用新字母行。。换句话说,经过完成吃水复本准备的新反对不与T共享一点愿意的。,更换一反对对低声说的话人家反对不注意一点情绪反应,用浅拷贝准备的新反对与原始反对共享。,更换一反对,另人家反对的身体部位也会用于加强语气。。

绍介完原型模式的获得密码晚年的,下面看下原型模式的类图,经过类图来理清原型模式获得中类中间的相干。详细类图如次:

三、原型模式的优错误

原型模式的优点有:

  1. 原型模式向客户遮蔽了准备新包围的复合物
  2. 原型模式容许静态补充节或较次的产品类。
  3. 原型模式预先消化了包围的准备妥协,厂子办法模式必要外表地PRO的改编妥协。,而原型模式不用要这么。
  4. 产品类不用要决定P的改编妥协,由于原型模式一致的一点的年级妥协

原型模式的错误有:

  1. 每个类都麝香装备人家机器人办法。
  2. 在机器人办法中,必要思索类的效能。,这就新移动来说归咎于很难。,只因为就持续存在的类没有的不变的轻易的。,尤其地当类援用不支持序列化用过的反对时,或援用圆妥协。。

四、.NET中原型模式的获得

In.NET,很轻易获得ICLANION电话话筒。这事电话话筒是原型。,布置机器人办法,均势于上述的密码达到目标MyKeKin原型的提取类。)中Clone()办法来获得原型模式,条件我们的想要自规定类具有机器人应变量,率先规定类成功和ICLLANION电话话筒并获得T。在.NET中获得了原型模式的类如次图所示(图中只截取了节,你可以应用反照器反编译程序器来检查。:

五、总结

到嗨几乎原型模式的绍介就完毕了,原型模式用人家原型反对来意味着所要准备的反对典型,话说回来,我们的应用完全一样的原型反对的办法来准备更多的反对。,这与厂子办法模式的获得绝相像性。,在家原型模式达到目标Clone办法就外表厂子办法模式达到目标厂子办法,不管到什么程度厂子办法模式的厂子办法是经过new运算符重行准备人家新的反对(相当于原型模式的深拷贝获得),而原型模式是经过调动MemberwiseClone办法来对原来是反对停止拷贝,那就是完全一样的。,同时在原型模式优点中也绍介了与厂子办法的分别(第三点)

本提出的全部的费力地找:设计模式之原型模式