zoukankan      html  css  js  c++  java
  • 大话设计模式之原型模式

           外国人把那京戏叫做“Beijing Opera ” 没见过那五色的油彩楞往脸上画,四击头一亮相,(哇……)美极了妙极了,简直“ok”顶呱呱 ,蓝脸的多尔敦盗御马,红脸的关公战长沙 ,黄脸的典韦白脸的曹操 ,黑脸的张飞叫喳喳…… ,细心的小朋友,细致区分就会发现,尽管每一个京剧演员都不同,但基本上仅仅具有几种脸型,长方形,圆形,细长,然后配上不同的妆容,胡子,眉毛,头饰,服装,有的再加点儿装饰物,就成了我们所示不同的演员角色,国粹和我们的编程有着什么样的联系呢?用面向对象的方法来说就是,我们先建立一个原型,然后通过对原型进行复制和修饰的方法,就能够产生一个和原型相似的新对象,用GOF的话来说就是,用原型实例指定创建对象的种类,而且通过拷贝这些原型创建新的对象。

           在大话设计模式,简历复印-原型模式这一节中,当我们创建一个类的实例的过程非常复杂,而且我们须要创建多个这样类的实例时,假设我们用new操作符去创建这种类实例,这未免会添加创建类的复杂度和耗费很多其它的内存空间,由于这样在内存中分配了多个一样的类实例对象,然后假设採用工厂模式来创建这种系统的话,随着产品类的不断添加,导致子类的数量不断增多,反而添加了系统复杂程度,所以在这里使用工厂模式来封装类创建过程并不合适,然而原型模式能够非常好地解决问题,由于每一个类实例都是同样的,当我们须要多个同样的类实例时,不是必需每次都使用new运算符去创建同样的类实例对象,此时我们一般思路就是想——仅仅创建一个类实例对象,假设后面须要很多其它这种实例,能够通过对原来对象拷贝一份来完毕创建,这样在内存中不须要创建多个同样的类实例,从而降低内存的消耗和达到类实例的复用。 然而这个思路正是原型模式的实现方式。以下我们来看看原型模式的结构图:

            

           前天,晚上放学回宿舍,一个不小心把钥匙弄丢了,结果进不了宿舍门,要是两个不小心还得了,呜呜,谢谢颖杰帮我开门,没办法啊,总要人家开门多不好,还是自己配一把吧,宿舍钥匙和车钥匙在一个钥匙圈上,幸好车钥匙另一把备份,找个时间去配一把宿舍钥匙和车钥匙,次日中午我拿着颖杰的钥匙,来到中门,配钥匙的师傅的手艺可真是熟练啊,仅仅见我把钥匙给了他,他直接找一个合适的钥匙胚子,把我的钥匙夹在配钥匙机的一端,胚子夹在另一端,一开电源,一把标尺比着我的钥匙齿型走一遍,砂轮就在胚子上复制出一把钥匙来!一分钟不到,两把新钥匙就搞定了!这里的旧钥匙是一个原型。配钥匙的过程就是依据我提供的原型,再复制一份出来,就有了一个新的钥匙。两个钥匙全然一样。我能够给新配的钥匙加上一个标签,以表明是我的,不能和颖杰的弄混了,再来看看我们的代码是怎样实现的呢:

               

    namespace Prototype
    {
        //抽象钥匙原型
        public abstract class Key
        {
            private string name;
     
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            private string owner;
     
            public string Owner
            {
                get { return owner; }
                set { owner = value; }
            }
            public Key(string name, string owner)
            {
                this.name = name;
                this.owner = owner;
            }
            //钥匙复制自身的抽象定义
            public abstract Key Clone();
            public override String ToString()
            {
                return this.Name + ", belongs to " + this.Owner;
            }
        }
        //宿舍钥匙
        public class DormitoryKey : Key
        {
            public  DormitoryKey(string owner) : base(" Dormitory Key", owner) { }
     
            public override Key Clone()
            {
                return new  DormitoryKey(this.Owner);
            }
        }
        //自行车钥匙
        public class BicycleKey : Key
        {
            public BicycletKey(string owner) : base("Bicycle Key", owner) { }
     
            public override Key Clone()
            {
                return new BicycleKey(this.Owner);
            }
        }
        //client调用方法
        public class Client
        {
            public static void Main(string[] args)
            {
                Key oldDormitoryKey, newDormitoryKey, oldBicycleKey, newBicycleKey;
                oldDormitoryKey = new DormitoryKey("yingjie");
                newDormitoryKey = oldDormitoryKey.Clone();
                newDormitoryKey.Owner = "Me";
                oldBicycleKey = new BicycleKey("Me");
                newBicycleKey = oldBicycleKey.Clone();
                newBicycleKey.Owner = "yingjie";
     
                Console.WriteLine(oldDormitoryKey);
                Console.WriteLine(newDormitoryKey);
                Console.WriteLine(oldBicycleKey);
                Console.WriteLine(newBicycleKey);
            }
        }
    }
    
           原型模式在生成复杂对象比較苦难的环境中比較适用,通过克隆已有对象来实现创建新的对象,节省了时间和空间,原型模式应用于希望系统独立于产品的创建、表示和构成时,这和工厂模式非常类似。其实,和工厂模式相同的是,原型模式相同对客户隐藏了对象的创建工作,可是,与工厂模式通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。工厂模式适用于产品种类有限的情况下,当产品数量巨大或须要提供动态产品增删等性能时,使用原型模式具有更强的适应性。设计之旅,未完待续......

  • 相关阅读:
    ffmpeg 简单使用总结
    使用 Solr 构建企业级搜索服务器
    Linux 常用命令整理
    基于.net standard 的动态编译实现
    基于.net core 微服务的另类实现
    Java中线程总结
    关于EF中直接执行sql语句的参数化问题
    一个关于单据审核的流程演变
    java中匿名内部类总结
    Eclipse 中打开选中文件/文件夹所在目录
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4543498.html
Copyright © 2011-2022 走看看