浅谈原型模式

近期菜鸟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();

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

应用的场景:

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

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

注意事项:

深拷贝和浅拷贝的使用。

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

附图:

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

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

时间: 2024-08-29 21:37:10

浅谈原型模式的相关文章

浅谈三层模式

总觉的对三层的理解很肤浅,这几天看了相关的资料,无非谈的就是概括和基本组建附加个小例子!看完了,感觉说的大同小异,自己的理解好像也没什么多大变化,只不过加深了点罢了.不过想想有几天在这方面的思考,还是总结一下吧! 你去饭店吃饭,就遇见了三层,咱们唠唠吃饭这事! 服务员的作用就是给你上菜,收集你的信息,比如来个鱼香肉丝,或是几瓶啤酒,烤串什么的!总之你的一切请求都只是面向服务员的!至于厨师是男的,女的,负责给厨师买材料的采购员,你是没必要知道的.一切为了顾客,就是服务员的宗旨!等哪天这个服务员辞职

浅谈工厂模式

一个简单的计算器例子来描述工厂模式 Operator公共接口 package com.iss.factory; public interface Operator { public int getResult(int x, int y); } Add.java package com.iss.factory; public class Add implements Operator{ @Override public int getResult(int x, int y) { // TODO A

Android开发:浅谈MVP模式应用与内存泄漏

最近博主开始在项目中实践MVP模式,却意外发现内存泄漏比较严重,但却很少人谈到这个问题,促使了本文的发布,本文假设读者已了解MVP架构. 本文原创作者:xiong_it,链接:http://blog.csdn.net/xiong_it MVP简介 M-Modle,数据,逻辑操作层,数据获取,数据持久化保存.比如网络操作,数据库操作 V-View,界面展示层,Android中的具体体现为Activity,Fragment P-Presenter,中介者,连接Modle,View层,同时持有modl

浅谈桥梁模式实现JDBC

在谈这个问题的时候,我们有必要先去了解一下什么是桥梁模式. 首先我们可以去理解一下桥梁模式的用意:即将抽象化(Abstraction)与实现(Implementation)脱耦,使得二者可以独立的变化.请注意以上用意中有三个关键词:抽象化.实现和脱耦. (1)抽象化 存在于多个实体中的共同的概念性联系,就是抽象化.作为一个过程,抽象化就是忽略一些信息,从而把不同是实体当做同样的实体来对待. (2)实现 即针对抽象化给出的具体实现. (3)脱耦 耦合是指两个实体行为的某种强关联,如果将他们的强关联

浅谈开发模式及架构发展

一.传统开发模式 传统的开发模式基本一般是重服务端的开发方式,大部分工作都在服务端执行,然后返回到客户端(通常是HTML).以Asp.net MVC为例,如下图: #1 根据请求的路由定位到对应的Controller的对应的Action. #2 执行相关逻辑,得到结果Model(也可能没有Model,如直接返回View). #3 定位并加载对应的View(也可能没有View,如返回TextResult,JsonResult等). #4 在服务端通过Razor引擎把Model和View绑定起来生成

iOS:个人浅谈工厂模式

一.什么是工厂方法? 正式的解释是:在基类中定义创建对象的一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟到子类中进行.工厂方法要解决的问题是对象的创建时机,它提供了一种扩展的策略,很好地符合了开放封闭原则.工厂方法也叫做虚构造器(Virtual Constructor). 个人的拙见是:通过工厂方法创建工厂对象,然后在工厂类中定义创建基类的子类对象的方法并通过外部传入的条件判断去创建哪一个子类对象,不过由于OC是运行时语言,所以工厂类虽然提供了创建子类对象的方法,但是在编译时期并

浅谈MVC模式

1. 如何设计一个程序的结构,这是一门专门的学问,叫做"架构模式"(architectural pattern),属于编程的方法论. MVC模式就是架构模式的一种,它对我的启发特别大.我觉得它不仅适用于开发软件,也适用于其他广泛的设计和组织工作. 下面是我对MVC模式的一些个人理解,不一定正确,主要用来整理思路. 2. MVC是三个单词的首字母缩写,它们是Model(模型).View(视图)和Controller(控制). 这个模式认为,程序不论简单或复杂,从结构上看,都可以分成三层.

Swift语言精要 - 浅谈代理模式(Delegate)

在iOS编程中,我们经常谈到代理代理,也就是delegate,那么什么是代理呢? 我们来看一下cocoa对它的描述: Delegation is Cocoa’s term for passing off some responsibilities of an object to another 顾名思义: 代理是把职责从一个对象传到另一个对象. 其实,如果编写过Java或者C#程序的朋友应该知道,我们在设计的时候经常使用到接口和组合,道理是一样的. 看一下下面的代码: 首先,我们定义一个协议 p

浅谈架构模式之解释器模式

1定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. ·文法:即语法规则.在解释器模式中每一个语法都将对应一个解释器对象,用来处理相应的语法规则.它对于扩展.改变文法以及增加新的文法规则都很方便. ·句子:解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子. · 抽象语法树:在解释器模式中可以通过一种称之为抽象语法树(Abstract Syntax Tree, AST)的图形方式来直观地表示语言的构成