原型模式(prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。允许一个对象再创建另外一个新对象的时候根本无需知道任何创建细节,只需要请求圆形对象的copy函数皆可。

1原型模式构成

客户(Client)角色:客户类提出创建对象的请求。
抽象原型(Prototype)角色:这是一个抽象角色,C++实现的抽象类,此角色给出所有的具体原型类所需的接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象原型角色所要求的接口。

2原型模式C++实现

(1)通过C++的拷贝构造函数实现

(2)clone()函数返回的类是基类,建议通过static_const<>()进行转换为子类

(3)原型模式实现过程中会涉及浅拷贝和深拷贝的问题,clone()编写的时候要注意

(4)原型模式创建新的对象简单了很多,只需要根据原型就可以获得,不过使用原型的时候内存在clone内部开辟,要记得释放

   1:   
   2:   /*设计模式学习系列之原型模式 
   3:  * 参考书籍《大话设计模式》 
   4:  * 通过明确的clone()来创造新对象,不需要知道创建的任何细节 
   5:  */ 
   6:  #include<iostream>
   7:  using namespace std ;
   8:  //接口类 
   9:  class Prototype
  10:  {
  11:  public:
  12:      virtual Prototype* Clone() const = 0 ;
  13:  };
  14:   
  15:  struct stStruct
  16:  {
  17:      int num ;
  18:      string str ;
  19:      
  20:      stStruct()
  21:      {
  22:          num= 0 ;
  23:          str = "" ;
  24:      }
  25:  };
  26:  class PrototypeA:public Prototype
  27:  {
  28:  protected:
  29:      int a ;
  30:      string str;    
  31:  public:    
  32:      PrototypeA():a(0)
  33:      {    
  34:      }
  35:      ~PrototypeA()
  36:      {    
  37:      }
  38:      //参数构造函数1 
  39:      PrototypeA(const int& _a , const string& _str ):a(_a),str(_str)
  40:      {
  41:          
  42:      }
  43:      //参数构造函数
  44:      PrototypeA(const PrototypeA& _proto)
  45:      {
  46:          a = _proto.a ;    
  47:          str = _proto.str;
  48:      } 
  49:      
  50:      //clone()函数 深拷贝 
  51:      Prototype* Clone() const
  52:      {
  53:          PrototypeA *P = new PrototypeA(*this);
  54:          return P ;
  55:      }
  56:      
  57:      void show()
  58:      {
  59:          cout << a << "---" << str << endl;
  60:      }
  61:      
  62:      void SetA(const int& _a)
  63:      {
  64:          a = _a ;
  65:      }
  66:      
  67:      void SetStr(const string& _str)
  68:      {
  69:          str = _str ;
  70:      }
  71:  };
  72:   
  73:  int main()
  74:  {
  75:      PrototypeA *test = new PrototypeA(1,"xxxx");
  76:      
  77:      //通过clone()创建 
  78:      PrototypeA *test_clone = static_cast<PrototypeA *>(test->Clone());
  79:      
  80:      //通过拷贝构造函数创建
  81:      PrototypeA *test2 = new PrototypeA(*test); 
  82:      
  83:      cout << "===============赋值结束"  << endl ;
  84:      test->show();
  85:      test_clone->show();
  86:      test2->show();
  87:      
  88:      cout << "===============修改值类型"  << endl ;
  89:      test->SetA(3);
  90:      test->show();
  91:      test_clone->show();
  92:      test2->show();    
  93:      
  94:      cout << "===============修改字符类型"  << endl ;    
  95:      test->SetStr("343245");
  96:      test->show();
  97:      test_clone->show();
  98:      test2->show();
  99:  }

3涉及到的C++知识点

(1)c++深拷贝和浅拷贝http://www.2cto.com/kf/201205/133802.html

(2)C++类 拷贝赋值构造函数http://blog.chinaunix.net/uid-25808509-id-354211.html

细雨淅淅 标签: 设计 模式

设计模式学习系列6 原型模式(prototype)的更多相关文章

  1. 设计模式(四)原型模式Prototype(创建型)

      设计模式(四)原型模式Prototype(创建型) 1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象 ...

  2. 设计模式系列之原型模式(Prototype Pattern)——对象的克隆

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  3. 跟着实例学习设计模式(7)-原型模式prototype(创建型)

    原型模式是创建型模式. 设计意图:用原型实例指定创建对象的类型,并通过拷贝这个原型来创建新的对象. 我们使用构建简历的样例的类图来说明原型模式. 类图: 原型模式主要用于对象的复制.它的核心是就是类图 ...

  4. 设计模式(五)原型模式 Prototype

    原型模式: 原型模式,是指基于一个已经给定的对象,通过拷贝的方式,创建一个新的对象,这个给定对象,就是“原型”. 在 Java 中,原型模式体现为 Object 的 clone() 方法. 所有类都可 ...

  5. 设计模式学习系列9 外观模式Facade

    1.概述 自己卖了一辆越野自行车,但毕竟不是自己定制的,买回来之后可能需要更改一下脚蹬,座皮,里程计数器或者刹车系统,假如将自行车看做一个整体系统,对我们而言使用的是自行车,然后我们对自己车构件的修改 ...

  6. 小菜学习设计模式(四)—原型(Prototype)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

  7. Java设计模式(4)原型模式(Prototype模式)

    Prototype模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是: ...

  8. Net设计模式实例之原型模式( Prototype Pattern)

    一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...

  9. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

随机推荐

  1. watchdog机制

    转自:http://blog.sina.com.cn/s/blog_4dff871201012yzh.html 什么是Watchdog? Watchdog,又称watchdog timer,是计算机可 ...

  2. [译] UML中的关系之Dependency

    在UML中,依赖关系表示Client依赖于另一个元素,叫做Supplier. 通常来说,依赖关系不需要特殊的名字. 依赖的类别 抽象 abstraction, derive, refine, trac ...

  3. InputStream的三个read的区别

    转自:http://www.blogjava.net/toby/archive/2009/04/24/267413.html 1.read这个方法是对这个流一个一个字节的读,返回的int就是这个字节的 ...

  4. struts.xml中可以使用el表达式和ognl表达式

    转自:http://blog.csdn.net/hzc543806053/article/details/7538723 文件上传链接: 1)Servlet 文件上传 ————  点击打开链接 2)S ...

  5. Android控件系列之RadioButton&RadioGroup(转)

    学习目的: 1.掌握在Android中如何建立RadioGroup和RadioButton 2.掌握RadioGroup的常用属性 3.理解RadioButton和CheckBox的区别 4.掌握Ra ...

  6. C++的那些事:面向对象

    1 OOP概述 面向对象基于三个基本概念:数据抽象.继承和动态绑定.通过使用数据抽象,我们可以将类的接口与实现分离:使用继承,可以定义相似的类型并对其相似关系建模:使用动态绑定,可以在一定程度上忽略相 ...

  7. 从维度理解dp问题

    对于dp,我目前的理解就是,干成题目中的那件事需要作出若干次决策,然后你要取其中最优的结果,我们可以用深搜来递归地找最优解,然后我们来观察一下这个递归树的形状,如果它能从底往上直接递推的话,就不用递归 ...

  8. CDH中,如果管理CM中没有的属性

    在CM配置管理中的"hive-site.xml 的 Hive 客户端高级配置代码段(安全阀)""仅适用于高级使用,逐个将字符串插入 hive-site.xml 的客户端配 ...

  9. diff和common

    diff 命令 diff命令:找出两个文件的不同点,用于比较文件的差异 linux上非常重要的工具,一般用于制作补丁文件,特别是比较两个版本不同的文件以找到改动的地方. diff在命令行中打印每一个行 ...

  10. Codeforces 86C Genetic engineering(AC自动机+DP)

    题目大概是给几个DNA片段,求构造一个长度n的字符串的方案数,要求这个字符串每个位置的字符都属于某个包含于此字符串的DNA片段. 把那些DNA片段建一个AC自动机.考虑状态的表示: dp[len][x ...