常见设计模式解析和实现(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)
原型模式: 原型模式主要针对模型对象类型的克隆,对已有构造好的对象进行复制获取一个新的对象实例.比如我们在获取一个对象并成功赋值后,要传递给多个处理类去处理. 打个比方:吃面是个处理类,面是个模型对象 ...
随机推荐
- Mysql 分页语句Limit用法
转载自:http://qimo601.iteye.com/blog/1634748 1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用 ...
- 分布式内存对象缓存系统Memcached-Linux下使用
Linux下Memcached的使用 1. 安装文件下载 1.1下载memcached服务器端安装文件 版本: memcached-1.4.2.tar.gz 下载地址:http://www ...
- Linux和Linux之间共享目录
1.Linux 服务器端NFS服务器的配置 以root身份登陆Linux服务器,编辑/etc目录下的共享目录配置文件exports,指定共享目录及权限等. 执行如下命令编辑文件/etc/exports ...
- 腾讯大讲堂ppt全集
腾讯大讲堂ppt全集 腾讯大讲堂ppt全集资料下载 腾讯大讲堂ppt1-62资料下载 最新最全的腾讯大讲堂ppt全集 腾讯大讲堂ppt全集资料下载 腾讯大讲堂ppt1-62资料下载地址 http:// ...
- uboot---linux
01uboot是没有虚拟地址的 02内存映射是linux内核的机制,也就是从实地址到虚拟地址是linux完成的! -----
- 22.allegro中PCB打印设置[原创]
1. -- 2. 3. 4. ----
- 用git difff 生成补丁
http://stackoverflow.com/questions/1191282/how-to-see-the-changes-between-two-commits-without-commit ...
- chrome下float元素下input选中内容bug
今天在写一个小demo的时候,发现chrome下一个很奇怪的bug. 我的代码如下: <!DOCTYPE html> <html lang="en"> &l ...
- ie下jquery ajax 80020101错误的解决方法
<script language="javascript"> <!-- function checkAll(name,isCheck){ ...
- HDU4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)
Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...