原型模式(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. hdu 1106:排序(水题,字符串处理 + 排序)

    排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...

  2. hdu 1159:Common Subsequence(动态规划)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  3. Java Hour 41 Maven ( 3 )

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 41.1 m2eclipse 简介 m2eclipse 是一款开源工具,为ec ...

  4. js event 2

    js event 2  浏览器兼容 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...

  5. Azure Mobile Services的REST API调用方式和自定义API

    Azure Mobile Services(移动服务)是微软在Azure平台中提供的一种跨平台的移动应用后端服务,即移动后端即服务.支持.NET和JavaScript(Node.js)写后端代码:支持 ...

  6. dp核心问题研究-从入门到放弃

    首先从数字三角形开始 这个题的特点是..本身遍历次序就是个树型的 每次的决策都已经给定,左下或者右下 并且当我们纠结于是往左下走还是往右下走的时候,每次根据当前的情况贪心都为时尚早,因为后面的数据可以 ...

  7. 关于Strut2内置Json插件的使用

    配置注意点: 在原有Struts2框架jar包的引入下,需要额外多加一个Json的插件包(struts2-json-plugin-2.3.7.jar) 在struts.xml配置文件中,包需要继承js ...

  8. LR结构图

  9. MVC 依赖注入扩展

    需求: 小明想要完成一个功能F,需要一把锤子T. 有两种办法可以实现: 1)小明很爱动手,精力很旺盛,于是,自己创建一个具有功能F的锤子T,并使用T来完成F: 2)小明很懒,天天睡大觉,于是,他叫小健 ...

  10. css构造块级元素

    css 1. 宽高width:数值;height:数值;也可用百分比!长高的设置不会被后代继承2. 背景(1)背景颜色background-color:颜色值;元素的背景颜色默认为transparen ...