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

UML结构图:

抽象基类:

1)  Prototype:虚拟基类,所有原型的基类,提供Clone接口函数

接口函数:

1)  Prototype::Clone函数:纯虚函数,根据不同的派生类来实例化创建对象。

解析:

Prototype模式其实就是常说的“虚拟构造函数”的一个实现,C++的实现机制中并没有支持这个特性,但是通过不同派生类实现的Clone接口函数可以完成与“虚拟构造函数”同样的效果。举一个例子来解释这个模式的作用,假设有一家店铺是配钥匙的,他对外提供配钥匙的服务(提供Clone接口函数),你需要配什么钥匙它不知道只是提供这种服务,具体需要配什么钥匙只有到了真正看到钥匙的原型才能配好。也就是说,需要一个提供这个服务的对象,同时还需要一个原型(Prototype),不然不知道该配什么要的钥匙。

实现:

1)Prototype.h

  1. #ifndef PROTOTYPE_H
  2. #define PROTOTYPE_H
  3. // 虚拟基类,所有原型的基类,提供Clone接口函数
  4. class Prototype
  5. {
  6. public:
  7. prototype(){}
  8. virtual ~Prototype(){}
  9. virtual Prototype *Clone() = 0;
  10. };
  11. // 派生自Prototype,实现Clone方法
  12. class ConcreatePrototype1:public Prototype
  13. {
  14. public:
  15. ConcreatePrototype1();
  16. ConcreatePrototype1(const ConcreatePrototype1&);
  17. virtual ~ConcreatePrototype1();
  18. virtual Prototype* Clone();
  19. };
  20. // 派生自Prototype,实现Clone方法
  21. class ConcreatePrototype2:public Prototype
  22. {
  23. public:
  24. ConcreatePrototype2();
  25. ConcreatePrototype2(const ConcreatePrototype2&);
  26. virtual ~ConcreatePrototype1();
  27. virtual Prototype* Clone();
  28. };
  29. #endif

(2)Prototype.cpp

  1. #include "Prototype.h"
  2. #include <iostream>
  3. ConcreatePrototype1::ConcreatePrototype1()
  4. {
  5. std::cout << "construction of ConcreatePrototype1\n";
  6. }
  7. ConcreatePrototype1::~ConcreatePrototype1()
  8. {
  9. std::cout << "destruction of ConcreatePrototype1\n";
  10. }
  11. ConcreatePrototype1::ConcreatePrototype1(const ConcreatePrototype1&)
  12. {
  13. std::cout << "copy construction of ConcreatePrototype1\n";
  14. }
  15. Prototype* ConcreatePrototype1::Clone()
  16. {
  17. return new ConcreatePrototype1(*this);
  18. }
  19. ConcreatePrototype2::ConcreatePrototype2()
  20. {
  21. std::cout << "construction of ConcreatePrototype2\n";
  22. }
  23. ConcreatePrototype2::~ConcreatePrototype2()
  24. {
  25. std::cout << "destruction of ConcreatePrototype2\n";
  26. }
  27. ConcreatePrototype2::ConcreatePrototype2(const ConcreatePrototype2&)
  28. {
  29. std::cout << "copy construction of ConcreatePrototype2\n";
  30. }
  31. Prototype* ConcreatePrototype2::Clone()
  32. {
  33. return new ConcreatePrototype2(*this);
  34. }

(3)main.cpp

  1. #include "Prototype.h"
  2. #include <stdio.h>
  3. int main()
  4. {
  5. Prototype* pPrototype1 = new ConcreatePrototype1();
  6. Prototype* pPrototype2 = pPrototype1->Clone();
  7. Prototype* pPrototype3 = new ConcreatePrototype2();
  8. Prototype* pPrototype4 = pPrototype3->Clone();
  9. delete pPrototype1;
  10. delete pPrototype2;
  11. delete pPrototype3;
  12. delete pPrototype4;
  13. }

常见设计模式解析和实现(C++)Prototype模式(原型模式)的更多相关文章

  1. 常见设计模式解析和实现(C++)FlyWeight模式

    作用:运用共享技术有效地支持大量细粒度的对象 UML结构图: 解析: Flyweight模式在大量使用一些可以被共享的对象的时候使用.比如,在QQ聊天时很多时候你懒得回复又不得不回复,一般会用一些客套 ...

  2. 常见设计模式解析和实现(C++)Adapt模式

    作用:将一个类的接口转换成客户希望的另一个接口.Adapt模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. UML示意图 1)      采用继承原有接口类的方式 2)采用组合原有接口类 ...

  3. 设计模式(六)Prototype Pattern 原型模式

    通过new产生一个对象非常繁琐,可以使用原型模式 原型模式实现: ——Cloneable接口和clone方法 ——Prototype模式实现起来最困难的地方是实现内存的复制和操作,Java中提供了cl ...

  4. java设计模式--创建模式--原型模式

    原型模式: 原型模式 概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 .当一个系统应该独立于它的产品创建.构成和表示时. .当要实例化的类是在运行时刻指定时,例如,通过 ...

  5. Constructor Prototype Pattern 原型模式(PHP示例)

    当一个类大部分都是相同的只有部分是不同的时候,如果需要大量这个类的对象,每次都重复实例化那些相同的部分是开销很大的,而如果clone之前建立对象的那些相同的部分,就可以节约开销. 针对php的一种实现 ...

  6. 设计模式01 创建型模式 - 原型模式(Protype Pattern)

    参考 1. 设计模式:原型模式 | 博客园 2. Java clone深拷贝.浅拷贝 | CSDN 3. Cloneable接口和Object的clone()方法 | 博客园 原型模式(Prototy ...

  7. Prototype Pattern 原型模式

    7.6 原型模式总结 原型模式作为一种快速创建大量相同或相似对象的方式,在软件开发中应用较为广泛,很多软件提供的复制(Ctrl + C)和粘贴(Ctrl + V)操作就是原型模式的典型应用,下面对该模 ...

  8. java-設計模式-原型模式

    原型模式 是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类. 問題: 如果我們要複製一個類實例: 首先, 你必须新建一个属于相同类的对象. 然后, 你必须遍历原始对象的所 ...

  9. 创建模式--原型模式(JAVA)

    原型模式: 原型模式主要针对模型对象类型的克隆,对已有构造好的对象进行复制获取一个新的对象实例.比如我们在获取一个对象并成功赋值后,要传递给多个处理类去处理. 打个比方:吃面是个处理类,面是个模型对象 ...

随机推荐

  1. Mysql 分页语句Limit用法

    转载自:http://qimo601.iteye.com/blog/1634748 1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用 ...

  2. Java Logger(java日志)

    目录 1. 简介2. 安装3. log4j基本概念3.1. Logger3.2. Appender3.2.1. 使用ConsoleAppender3.2.2. 使用FileAppender3.2.3. ...

  3. sudo和su

    su命令就是切换用户的工具 sudo 授权许可使用的su,也是受限制的su 1. sudo 的适用条件 由于su 对切换到超级权限用户root后,权限的无限制性,所以su并不能担任多个管理员所管理的系 ...

  4. Mmap的实现原理和应用

    http://blog.csdn.net/edwardlulinux/article/details/8604400 很多文章分析了mmap的实现原理.从代码的逻辑来分析,总是觉没有把mmap后读写映 ...

  5. HDU 3757 Evacuation Plan DP

    跟 UVa 1474 - Evacuation Plan 一个题,但是在杭电上能交过,在UVa上交不过……不知道哪里有问题…… 将施工队位置和避难所位置排序. dp[i][j] 代表前 i 个避难所收 ...

  6. (七)CSS定位(Positioning)

    CSS定位属性允许对元素进行定位. 一切皆为框: div.h1或p元素常被称为块级元素,而span和strong等元素成为行内元素,但是可是使用 display 属性改变框的类型,将display设置 ...

  7. *像word一样编辑复杂的文本:SpannableString 样式详介

    简介: 使用android.text.Spanned; android.text.SpannableString; android.text.SpannableStringBuilder; 和 and ...

  8. C++ STL之vector容器的基本操作

    注意事项:特别注意任何时候同时使用两个迭代器产生的将会是一个前闭后开的区间(具体见插入和删除的例子)特别注意begin()指向的是vec中的第0个元素,而end是指向最后一个元素的后面一个位置(不是最 ...

  9. devDependencies和dependencies的区别

    我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入到 package.json 文件里面去,比如: --save-dev --save 在 package.json 文件里面 ...

  10. 计算几何基础——矢量和叉积 && 叉积、线段相交判断、凸包(转载)

    转载自 http://blog.csdn.net/william001zs/article/details/6213485 矢量 如果一条线段的端点是有次序之分的话,那么这种线段就称为 有向线段,如果 ...