原型模式(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. 会员制实现C2B定制有机农产品,被中粮我买投资的良食网这样卖有机生鲜

    前几天,中粮我买网战略投资了位于深圳的有机生鲜自营平台良食网,宣布双方将会在供应链上展开合作.然而良食网对大家来说还是比较陌生的,为此36氪专访了良食网的创始人唐忠. 良食网成立于2011年,是一家以 ...

  2. gitlab+TortoiseGit中使用SSH

    1.在文件夹空白位置右键打开"Git Bash" 2.按 https://gitlab.yourhost.com/help/ssh/ssh.md 中的说明,输入命令   ssh-k ...

  3. 封装了get post方法

    function g($name, $defaultValue = "") { // php这里区分大小写,将两者都变为小写 $_GET = array_change_key_ca ...

  4. hdu 2444 二分图判断与最大匹配

    题意:有n个学生,有m对人是认识的,每一对认识的人能分到一间房,问能否把n个学生分成两部分,每部分内的学生互不认识,而两部分之间的学生认识.如果可以分成两部分,就算出房间最多需要多少间,否则就输出No ...

  5. GRE学习日志

    发现开博客园真的很有督促作用,今天也顺便开个GRE学习日志吧 2015-02-09:单词 2015-02-10:单词 2015-02-11:单词 2015-03-02:阅读 2015-03-04:阅读 ...

  6. CPU的性能对比

    笔记本CPU之前的性能对比 下面的分数都是根据PerformanceTest测试的出来的结果,现在的笔记本CPU有很多种,你在购买笔记本的时候只看到CPU的型号,而且现在的CPU型号太多而且命名方式也 ...

  7. JSP Servlet 路径解析 路径设置

    转自:http://ethen.iteye.com/blog/800415 在用JSP和Servlet编写Web应用时,经常遇到的问题就是找不到.do路径,或者.do路径不能解析,其实归根到底就是Se ...

  8. Struts表单格局;theme三个属性值:simple,xhtml,css_xhtml

    转自:http://www.educity.cn/wenda/7156.html 解决Struts2 Form表单自己布局之前先看看 theme 属性, theme属性提供 三个属性值:simple, ...

  9. Android 2D游戏引擎AndEngine配置环境

    Android 2D游戏引擎AndEngine配置环境 1.2  配置环境 在任何编程中,都需要一些软件或者硬件的支持.否则,没有硬件软件是不可能存在的,而想要编写对应语言的的程序,这需要对应语言库和 ...

  10. Linux部署项目简要记录【只是步骤没有配图】

    1.服务器(192.168.1.197)新建数据库jspxcms_1206,导入数据2.eclipse打war包3.上传war包到/home/app/apache-tomcat-7.0.68/weba ...