常见设计模式解析和实现(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)
原型模式: 原型模式主要针对模型对象类型的克隆,对已有构造好的对象进行复制获取一个新的对象实例.比如我们在获取一个对象并成功赋值后,要传递给多个处理类去处理. 打个比方:吃面是个处理类,面是个模型对象 ...
随机推荐
- [z]CAP原理和BASE思想
分布式领域CAP理论,Consistency(一致性), 数据一致更新,所有数据变动都是同步的Availability(可用性), 好的响应性能Partition tolerance(分区容错性) 可 ...
- 汇编debug 截图3
- Ado.Net小练习03(省市联动)
前台界面: 后台代码: namespace _04省市联动 { public partial class Form1 : Form { public ...
- 使用CXF暴露您的REST服务
使用CXF暴露您的REST服务 REST应用服务器SpringBeanServlet 1. 前言 现在互联网Open API流行,将您的Web应用也可以开放Open API给其他第三方使用.达到一 ...
- NSDate & NSDateFormatter
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasep ...
- cocos2dx开发笔记
1.帧动画:SpriteTest=>SpriteAnimationSplit 2.sourceinsight显示代码行 option->document option->editin ...
- 面试题_89_to_92_单元测试 JUnit 面试题
89)如何测试静态方法?(答案)可以使用 PowerMock 库来测试静态方法. 90)怎么利用 JUnit 来测试一个方法的异常?(答案) 91)你使用过哪个单元测试库来测试你的 Java 程序?( ...
- mac下git中文乱码
今天从window切mac,git使用时各种问题.典型的就是,git commit 可以使用中文注释,但是使用 git log 查看的时候发现都是乱码,乱码效果如下: <B1><E0 ...
- gulp 使用mailgun服务器发送邮件
1.首先你需要创建一个 mailgun 账户,没有请去注册一个. 注册之后会有 mailgun 会给你一个默认的子域名,你就可以使用这个子域名去发送邮件了,如下图: 2.gulp创建任务: var s ...
- bzoj2431: [HAOI2009]逆序对数列
dp. f[i][j]表示放置第i个数有j个逆序对的方案数. s[i][j]维护前缀和(f[i][0]~f[i][j]). 状态转移方程 f[i][j]=s[i-1][j]-s[i-1][max(j- ...