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

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. 表单插件——form

    表单插件——form 通过表单form插件,调用ajaxForm()方法,实现ajax方式向服务器提交表单数据,并通过方法中的options对象获取服务器返回数据,调用格式如下: $(form). a ...

  2. Python批量读取人脸图片与数据互相转换

    读取部分结果 程序 # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from PIL import ...

  3. sizeof 和strlen的区别

    1. 编译时计算运算符sizeof,可用类型或变量做参数,计算占用内存的大小.sizeof后若是类型必须加括弧,若是变量名可不加括弧.sizeof(x)可用来定义数组维数.如:printf(" ...

  4. 一步一步开发sniffer(Winpcap+MFC)(一)工欲善其事,必先配环境——配置winpcap开发环境(图文并茂,非常清楚)

    http://blog.csdn.net/litingli/article/details/5950962

  5. BSD历史

    在UNIX问世之后(关于UNIX来历史这里不详述),UNIX拥有者AT&T公司以低廉甚至免费的许可将Unix源码授权给学术机构做研究或教学之用. 加州大学伯克利分校就是其中之一.在得到源码后, ...

  6. iOS:自定义工具栏、导航栏、标签栏

    工具栏为UIToolBar,导航栏UINavigationBar,标签栏UITabBar.它们的样式基本上时差不多的,唯一的一点区别就是,工具栏一般需要自己去创建,然后添加到视图中,而导航栏和标签栏不 ...

  7. 修改linux命令行提示符路径显示

    命令显示行太长,影响观感,这样需要修改,具体方法: 1. 修改 ~/.bashrc,在最后一行添加: export PS1='[\u@\h\W]$' 其中\u是当前用户名,\h是当前主机名,\w显示当 ...

  8. AndroidApplication Fundamentals(Android应用基础)

    AndroidApplication Fundamentals(Android应用基础) Android应用采用Java编程语言来编写,AndroidSDK工具编译我们的代码,连同任何数据和资源文件一 ...

  9. java实现最基础的socket网络通信

    一.网络通信基础 网络中存在很多的通信实体,每一个通信实体都有一个标识符就是IP地址. 而现实中每一个网络实体可以和多个通信程序同时进行网络通信,这就需要使用端口号进行区分. 二.java中的基本网络 ...

  10. 使用easyui实现列表的批量删除

    使用easyui实现列表的批量删除 首先要做的就是增加一个多选框 <table id="otGrid" nowrap="false" style=&quo ...