作用

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone), Clone()实现和具体的语言相关,在C++中通过拷贝构造函数实现。

UML图如下:

代码如下:

Prototype.h

  1. #ifndef _PROTOTYPE_H_
  2. #define _PROTOTYPE_H_
  3.  
  4. /*Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone)
  5. Clone()实现和具体的语言相关,在C++中通过拷贝构造函数实现
  6.  
  7. 作用:
  8. 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
  9.  
  10. */
  11.  
  12. /*Prototype原型基类,定义Clone接口函数
  13. */
  14. class Prototype
  15. {
  16. protected:
  17. Prototype();
  18. public:
  19. virtual Prototype* Clone() const=;//定义Clone接口,根据不同的派生类来实例化对象
  20. virtual ~Prototype();
  21. };
  22.  
  23. //派生自Prototype,实现其接口函数
  24. class ConcretePrototype1:public Prototype
  25. {
  26. public:
  27. ConcretePrototype1();//构造函数
  28. ~ConcretePrototype1();//析构函数
  29. ConcretePrototype1(const ConcretePrototype1&);//拷贝构造函数
  30. virtual Prototype* Clone() const;//实现基类定义的Clone接口,内部调用拷贝构造函数实现复制功能
  31. };
  32.  
  33. //派生自Prototype,实现其接口函数
  34. class ConcretePrototype2:public Prototype
  35. {
  36. public:
  37. ConcretePrototype2();//构造函数
  38. ~ConcretePrototype2();//析构函数
  39. ConcretePrototype2(const ConcretePrototype2&);//拷贝构造函数
  40. virtual Prototype* Clone() const;//实现基类定义的Clone接口,内部调用拷贝构造函数实现复制功能
  41. };
  42.  
  43. #endif

Prototype.cpp

  1. #include "Prototype.h"
  2. #include "iostream"
  3.  
  4. using namespace std;
  5.  
  6. ////Prototype
  7. Prototype::Prototype()
  8. {
  9. cout<<"Prototype"<<endl;
  10. }
  11.  
  12. Prototype::~Prototype()
  13. {
  14. cout<<"~Prototype"<<endl;
  15. }
  16.  
  17. //ConcretePrototype1
  18. ConcretePrototype1::ConcretePrototype1()
  19. {
  20. cout<<"ConcretePrototype1"<<endl;
  21. }
  22.  
  23. ConcretePrototype1::~ConcretePrototype1()
  24. {
  25. cout<<"~ConcretePrototype1"<<endl;
  26. }
  27.  
  28. ConcretePrototype1::ConcretePrototype1(const ConcretePrototype1& cp)
  29. {
  30. cout<<"ConcretePrototype1 copy"<<endl;
  31. }
  32.  
  33. Prototype* ConcretePrototype1::Clone() const
  34. {
  35. return new ConcretePrototype1(*this);
  36. }
  37.  
  38. //ConcretePrototype2
  39. ConcretePrototype2::ConcretePrototype2()
  40. {
  41. cout<<"ConcretePrototype2"<<endl;
  42. }
  43.  
  44. ConcretePrototype2::~ConcretePrototype2()
  45. {
  46. cout<<"~ConcretePrototype2"<<endl;
  47. }
  48.  
  49. ConcretePrototype2::ConcretePrototype2(const ConcretePrototype2& cp)
  50. {
  51. cout<<"ConcretePrototype2 copy"<<endl;
  52. }
  53.  
  54. Prototype* ConcretePrototype2::Clone() const
  55. {
  56. return new ConcretePrototype2(*this);
  57. }

main.cpp

  1. #include "Prototype.h"
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7. /*原型模式作用:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
  8. Prototype模式重在从自身复制自己创建新类,隐藏(不需知道)对象创建的细节
  9. */
  10.  
  11. /*1、用原型实例p1指定创建对象的种类ConcretePrototype1 */
  12. Prototype* p1 = new ConcretePrototype1();
  13.  
  14. /*2、通过拷贝这些原型创建新的对象 */
  15. Prototype* p2 = p1->Clone();
  16.  
  17. cout<< "------------------------" << endl;
  18.  
  19. Prototype* p3 = new ConcretePrototype2();
  20. Prototype* p4 = p3->Clone();
  21.  
  22. cout<< "------------------------" << endl;
  23.  
  24. delete p1;
  25. delete p2;
  26. cout<< "------------------------" << endl;
  27.  
  28. delete p3;
  29. delete p4;
  30.  
  31. return ;
  32. }

Prototype模式和Builder模式、AbstractFactory模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是:Builder模式重在复杂对象的一步步创建(并不直接返回对象),AbstractFactory模式重在产生多个相互依赖类的对象,而Prototype模式重在从自身复制自己创建新类。

C++设计模式-Prototype原型模式的更多相关文章

  1. 一天一个设计模式——Prototype 原型模式

    一.模式说明 看了比较多的资料,对原型模式写的比较复杂,个人的理解就是模型复制,根据现有的类来直接创建新的类,而不是调用类的构造函数. 那为什么不直接调用new方法来创建类的实例呢,主要一个原因是如果 ...

  2. 设计模式:Prototype 原型模式 - 同学你抄过别人的作业么?-clone()方法的使用

    原型模式: 通过某个类的实例来创建对象 使用原型模式的好处: 好处是什么呢?当我们需要多次重复的创建一个类的示例的时候,我们可以使用new但是,new不仅仅耗费内存而且,如果new 某个类的构造方法中 ...

  3. 5.设计模式----prototype原型模式

    原型模式:做到是原型,那肯定是自己本身才是原型,原型模式属于对象的创建模式. 关于原型模式的实现方式分2种: (1)简单形式.(2)登记形式,这两种表现形式仅仅是原型模式的不同实现. package ...

  4. 设计模式_11_原型模式(prototype)深拷贝、浅拷贝

    设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...

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

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

  6. C#设计模式之六原型模式(Prototype)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  7. C#设计模式之五原型模式(Prototype Pattern)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  8. C#设计模式(6)——原型模式(Prototype Pattern) C# 深浅复制 MemberwiseClone

    C#设计模式(6)——原型模式(Prototype Pattern)   一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创 ...

  9. 设计模式05: Prototype 原型模式(创建型模式)

    Prototype 原型模式(创建型模式) 依赖关系的倒置抽象不应该依赖于实现细节,细节应该依赖于抽象.对所有的设计模式都是这样的. -抽象A直接依赖于实现细节b -抽象A依赖于抽象B,实现细节b依赖 ...

随机推荐

  1. windows环境下创建 .文件夹

    一.windows环境下创建 .文件夹 1.新建一个文件夹 2.重命名为.properties.(名字前后都加点) 二.windows环境下创建 .文件 1.上面的方法对文件同样适用 2.运行CMD, ...

  2. ORACLE 数据库 MOD 函数用法

    1.求2和1的余数. Select mod(2,1) from dual: 2能被1整除所以余数为0. 2.MOD(x,y)返回X除以Y的余数.如果Y是0,则返回X的值. Select mod(2,0 ...

  3. 自己瞎捣腾的Win7下Linux安装之路-----图例篇

    写在前面 网上很多这方面的教程,我也是参考他们的文章和一些书籍才弄成功.没啥创新性,只为记录下来,以供自已理解和以后复习. 所谓工欲善其事,必先利其器.俺想学习Linux,当然是要先装一个Linux( ...

  4. 关于css3

    1.选择器: 属性选择器:[]; 查找条件:属性:我们可以通过属性来查找[^=][$=][*=][=][attr] 伪类选择器:  ::: ::before:::after: 必须指定一个conten ...

  5. MIT JOS学习笔记03:kernel 02(2016.11.08)

    未经许可谢绝以任何形式对本文内容进行转载! 本篇接着上一篇对kernel的分析. (5)pte_t * pgdir_walk(pde_t *pgdir, const void *va, int cre ...

  6. 创建js对象的属性和方法

    按照如下的创建对象的方法,可以节省内存.记录一下方便日后使用 <!Doctype html><html> <head> <title></titl ...

  7. div四个边框分别设置阴影样式

    对于div边框的阴影一直没有很好地理解,也一直不明白怎么给四个边框分别设置阴影.昨天项目中碰到了这个问题,就认真想了一下,在此总结一二. 首先,还是从官方解释说起. 网上的解释通常都是什么水平阴影长度 ...

  8. 随机函数的代码(srand、rand)

    #include<stdio.h> int main() int counter; for(counter=0;counter<10;counter++) { srand(count ...

  9. $.map和$.extend来复制数组(OA差旅)

    $.map:对数组的每个元素调用定义的回调函数并返回包含结果的数组. 对数组用指定的方法. //将原数组中每个元素加 4 转换为一个新数组. //jQuery 代码: $.map( [0,1,2], ...

  10. Android 启动模式及常用的Intent的Flag

    LaunchMode 在声明Activity的xml中指定 android:launchMode="xxx" standard 标准模式.这是系统默认的模式,每次启动Activit ...