开发者社区> 丁国华> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

大话设计模式之原型模式

简介:        外国人把那京戏叫做“Beijing Opera ” 没见过那五色的油彩楞往脸上画,四击头一亮相,(哇……)美极了妙极了,简直“ok”顶呱呱 ,蓝脸的多尔敦盗御马,红脸的关公战长沙 ,黄脸的典韦白脸的曹操 ,黑脸的张飞叫喳喳…… ,细...
+关注继续查看
       外国人把那京戏叫做“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);
        }
    }
    //客户端调用方法
    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);
        }
    }
}
       原型模式在生成复杂对象比较苦难的环境中比较适用,通过克隆已有对象来实现创建新的对象,节省了时间和空间,原型模式应用于希望系统独立于产品的创建、表示和构成时,这和工厂模式很类似。事实上,和工厂模式相同的是,原型模式同样对客户隐藏了对象的创建工作,但是,与工厂模式通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。工厂模式适用于产品种类有限的情况下,当产品数量巨大或需要提供动态产品增删等性能时,使用原型模式具有更强的适应性。设计之旅,未完待续......

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
大话设计模式C++版本-06-原型模式
大话设计模式C++版本-06-原型模式
0 0
23种设计模式-创建模式-原型模式(五)
23种设计模式-创建模式-原型模式(五)
0 0
大话设计模式之简单工厂模式
简单工厂模式   最近朋友推荐了一本书《大话设计模式》,此书刚刚到,博主也还没开始看,希望以博文的方式与大家一起分享,一起学习. 简单工厂模式,也就是说,到底要实列化谁,将来会不会增加实列化的对象,比如增加开根运算,这是很容易实列化的地方应该考虑用一个单独的类来做这个创造实列的过程,这就是工厂,来我们一起看看这个类如何写。
509 0
大话设计模式之单例模式
<p><span style="font-size:24px"><strong><span style="font-family:KaiTi_GB2312">一.引入</span></strong></span></p> <p><span style="font-size:24px"><span style="font-family:KaiTi_GB2312">小菜遇到的问题:“工具箱”
888 0
大话设计模式之建造者模式
        盘古开辟了天地,用身躯造出日月星辰、山川草木。那残留在天地间的浊气慢慢化作虫鱼鸟兽,为这寂静的世界增添了生气。这时,有一位女神女娲,在这莽莽的原野上行走。
856 0
大话设计模式之模板方法模式
          模板?生科的小朋友或许会这样理解,DNA复制或转录时,用来产生互补链的核苷酸序列。在我们的日程生活中,我们也时常与模板打交道,比如有些师哥师姐毕业了,需要写简历应聘,这个时候就有了简历模板;临近毕业大四的孩子,需要准备论文,就有了论文模板,所以,模板的概念就是有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新完善它,例如简历模板,从网上down下来的简历模板的格式都是相同的,要想拿到一份满意的offer,我们首先要根据自己的情况填充不同的内容完成属于自己的简历,拿到那梦寐以求的Offer。
899 0
大话设计模式之工厂模式
       千百年来,关于“空中花园”有一个美丽动人的传说。新巴比伦国王尼布甲尼撒二世娶了米底的公主安美依迪丝为王后。公主美丽可人,深得国王的宠爱。
1008 0
大话设计模式之装饰模式
          装饰,字面意思是对生活用品或生活环境进行艺术加工的手法。它必须与所装饰的客体有机地结合,成为统一、和谐的整体,以便丰富艺术形象,扩大艺术表现力,加强审美效果,并提高其功能、经济价值和社会效益。
746 0
1、大话设计模式,简单工厂
1、通过设计模式,找到封装变化,对象间松散耦合,针对接口编程的感觉,设计易维护、易扩展、易复用、灵活性好的程序。 2、通过封装,继承,多态把程序的耦合度降低。把业务逻辑与界面逻辑分开,让它们之间的耦合度下降,使他们更容易维护和扩展。
668 0
+关注
丁国华
你只管努力,剩下的交给时光!
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载