常见设计模式解析和实现(C++)Prototype模式(原型模式)
作用:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
UML结构图:

抽象基类:
1) Prototype:虚拟基类,所有原型的基类,提供Clone接口函数
接口函数:
1) Prototype::Clone函数:纯虚函数,根据不同的派生类来实例化创建对象。
解析:
Prototype模式其实就是常说的“虚拟构造函数”的一个实现,C++的实现机制中并没有支持这个特性,但是通过不同派生类实现的Clone接口函数可以完成与“虚拟构造函数”同样的效果。举一个例子来解释这个模式的作用,假设有一家店铺是配钥匙的,他对外提供配钥匙的服务(提供Clone接口函数),你需要配什么钥匙它不知道只是提供这种服务,具体需要配什么钥匙只有到了真正看到钥匙的原型才能配好。也就是说,需要一个提供这个服务的对象,同时还需要一个原型(Prototype),不然不知道该配什么要的钥匙。
实现:
1)Prototype.h
- #ifndef PROTOTYPE_H
- #define PROTOTYPE_H
- // 虚拟基类,所有原型的基类,提供Clone接口函数
- class Prototype
- {
- public:
- prototype(){}
- virtual ~Prototype(){}
- virtual Prototype *Clone() = 0;
- };
- // 派生自Prototype,实现Clone方法
- class ConcreatePrototype1:public Prototype
- {
- public:
- ConcreatePrototype1();
- ConcreatePrototype1(const ConcreatePrototype1&);
- virtual ~ConcreatePrototype1();
- virtual Prototype* Clone();
- };
- // 派生自Prototype,实现Clone方法
- class ConcreatePrototype2:public Prototype
- {
- public:
- ConcreatePrototype2();
- ConcreatePrototype2(const ConcreatePrototype2&);
- virtual ~ConcreatePrototype1();
- virtual Prototype* Clone();
- };
- #endif
(2)Prototype.cpp
- #include "Prototype.h"
- #include <iostream>
- ConcreatePrototype1::ConcreatePrototype1()
- {
- std::cout << "construction of ConcreatePrototype1\n";
- }
- ConcreatePrototype1::~ConcreatePrototype1()
- {
- std::cout << "destruction of ConcreatePrototype1\n";
- }
- ConcreatePrototype1::ConcreatePrototype1(const ConcreatePrototype1&)
- {
- std::cout << "copy construction of ConcreatePrototype1\n";
- }
- Prototype* ConcreatePrototype1::Clone()
- {
- return new ConcreatePrototype1(*this);
- }
- ConcreatePrototype2::ConcreatePrototype2()
- {
- std::cout << "construction of ConcreatePrototype2\n";
- }
- ConcreatePrototype2::~ConcreatePrototype2()
- {
- std::cout << "destruction of ConcreatePrototype2\n";
- }
- ConcreatePrototype2::ConcreatePrototype2(const ConcreatePrototype2&)
- {
- std::cout << "copy construction of ConcreatePrototype2\n";
- }
- Prototype* ConcreatePrototype2::Clone()
- {
- return new ConcreatePrototype2(*this);
- }
(3)main.cpp
- #include "Prototype.h"
- #include <stdio.h>
- int main()
- {
- Prototype* pPrototype1 = new ConcreatePrototype1();
- Prototype* pPrototype2 = pPrototype1->Clone();
- Prototype* pPrototype3 = new ConcreatePrototype2();
- Prototype* pPrototype4 = pPrototype3->Clone();
- delete pPrototype1;
- delete pPrototype2;
- delete pPrototype3;
- delete pPrototype4;
- }
常见设计模式解析和实现(C++)Prototype模式(原型模式)的更多相关文章
- 常见设计模式解析和实现(C++)FlyWeight模式
作用:运用共享技术有效地支持大量细粒度的对象 UML结构图: 解析: Flyweight模式在大量使用一些可以被共享的对象的时候使用.比如,在QQ聊天时很多时候你懒得回复又不得不回复,一般会用一些客套 ...
- 常见设计模式解析和实现(C++)Adapt模式
作用:将一个类的接口转换成客户希望的另一个接口.Adapt模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. UML示意图 1) 采用继承原有接口类的方式 2)采用组合原有接口类 ...
- 设计模式(六)Prototype Pattern 原型模式
通过new产生一个对象非常繁琐,可以使用原型模式 原型模式实现: ——Cloneable接口和clone方法 ——Prototype模式实现起来最困难的地方是实现内存的复制和操作,Java中提供了cl ...
- java设计模式--创建模式--原型模式
原型模式: 原型模式 概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 .当一个系统应该独立于它的产品创建.构成和表示时. .当要实例化的类是在运行时刻指定时,例如,通过 ...
- Constructor Prototype Pattern 原型模式(PHP示例)
当一个类大部分都是相同的只有部分是不同的时候,如果需要大量这个类的对象,每次都重复实例化那些相同的部分是开销很大的,而如果clone之前建立对象的那些相同的部分,就可以节约开销. 针对php的一种实现 ...
- 设计模式01 创建型模式 - 原型模式(Protype Pattern)
参考 1. 设计模式:原型模式 | 博客园 2. Java clone深拷贝.浅拷贝 | CSDN 3. Cloneable接口和Object的clone()方法 | 博客园 原型模式(Prototy ...
- Prototype Pattern 原型模式
7.6 原型模式总结 原型模式作为一种快速创建大量相同或相似对象的方式,在软件开发中应用较为广泛,很多软件提供的复制(Ctrl + C)和粘贴(Ctrl + V)操作就是原型模式的典型应用,下面对该模 ...
- java-設計模式-原型模式
原型模式 是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类. 問題: 如果我們要複製一個類實例: 首先, 你必须新建一个属于相同类的对象. 然后, 你必须遍历原始对象的所 ...
- 创建模式--原型模式(JAVA)
原型模式: 原型模式主要针对模型对象类型的克隆,对已有构造好的对象进行复制获取一个新的对象实例.比如我们在获取一个对象并成功赋值后,要传递给多个处理类去处理. 打个比方:吃面是个处理类,面是个模型对象 ...
随机推荐
- Linux中断(interrupt)子系统
Linux中断(interrupt)子系统之一:中断系统基本原理 Linux中断(interrupt)子系统之二:arch相关的硬件封装层 Linux中断(interrupt)子系统之三:中断流控处理 ...
- windows下顽固软件卸载不了的解决方法
下面以autocad2012举例: cad2012卸载显示 “无法获得同类产品” 而且也安装不上. 解决方法:1,开始>运行>输入"regedit",找到下面的注册表路 ...
- Lumina将是基于 Qt工具箱,旨在取代KDE成为PC-BSD默认的桌面环境
Lumina Desktop 1.1.0 发布了,该版本是重要更新,包括全新的以及完全重新编写的utilities,并对底层基础架构进行改进. Lumina将是基于 Qt工具箱,旨在取代KDE成为PC ...
- iOS iOS7越狱
1.使用盘古越狱工具 (或者PP助手) 2.越狱成功后需要安装Apple File Conduit “2”,用于替代afc2add插件 3.安装AppSync插件 (绕过系统验证,随意安装.运行破解的 ...
- Shuffle和排序
MapReduce确保每个reducer的输入都按键排序.系统执行排序的过程——将map输出作为输入传给reducer——称为shuffle.shuffle属于不断被优化和改进的代码库的一部分,从许多 ...
- python 有关矩阵行列的存取 np.array
初始化 a = range() a = np.array(a) a = a.reshape(,) a [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 ...
- SAP 物料基本单位与BOM单位
比如:物料的基本单位是G,可该物料放到BOM中的单位却是PC,该如何实现呢? 1. 首先要弄清楚BOM单位优先取的是发货单位(工厂数据视图1),当发货单位为空时,取基本单位: 2. 然后再建立单位G ...
- git cheat sheet,git四张手册图
- ImageView的属性android:scaleType,即ImageView.setScaleType(ImageView.ScaleType)
1 imageView.setScaleType(ImageView.ScaleType.FIT_XY ); 1 这里我们重点理解ImageView的属性android:scaleType,即Imag ...
- 如何使java中double类型不以科学计数法表示
在java中,把一个double或者BigDecimal的小数转换为字符串时,经常会用科学计数法表示,而我们一般不想使用科学计数法,可以通过:DecimalFormat a = new Decimal ...