常见设计模式解析和实现(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)
原型模式: 原型模式主要针对模型对象类型的克隆,对已有构造好的对象进行复制获取一个新的对象实例.比如我们在获取一个对象并成功赋值后,要传递给多个处理类去处理. 打个比方:吃面是个处理类,面是个模型对象 ...
随机推荐
- Openfire 服务端在Eclipse上部署
http://blog.csdn.net/chexitianxia/article/details/9371169 结合: http://blog.csdn.net/ares1201/article/ ...
- 可持久化trie 学习总结
QAQ 以前一直觉得可持久化trie很难,今天强行写了一发觉得还是蛮简单的嘛 自己的模板是自己手写的,写了几道题目并没有出过错误 THUSC的第二题的解法五貌似就是可持久化trie,时间复杂度O(60 ...
- Spring的lazy-init详解
1.Spring中lazy-init详解ApplicationContext实现的默认行为就是在启动服务器时将所有singleton bean提前进行实例化(也就是依赖注入).提前实例化意味着作为初始 ...
- 255. Verify Preorder Sequence in Binary Search Tree
题目: Given an array of numbers, verify whether it is the correct preorder traversal sequence of a bin ...
- chmod u+x 脚本文件
[root@ossec-server Shell]# chmod u+x whologged.sh解释: chmod:改变权限 u:文件所有用户 +x: 增加可执行权限 [root@ossec-ser ...
- OSCache 缓存技术
前言:OSCache标记库由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能.OSCache是个一个广泛采用的高性能的J2EE缓存框架 ...
- MacOS安装phpMyAdmin几点问题
1. 登录时出现“#2002 无法登录 MySQL 服务器”. 原因: phpMyAdmin为PHP编写,MacOS默认安装的php配置,设置mysql监听socket默认为/var/mysql/my ...
- hdu 4970 Killing Monsters (思维 暴力)
题目链接 题意: 有n座塔,每座塔的攻击范围为[l,r],攻击力为d,有k个怪兽从这些塔前面经过,第i只怪兽初始的生命力为hp,出现的位置为x,终点为第n个格子.问最后有多少只怪兽还活着. 分析: 这 ...
- Eclipse中设置在创建新类时自动生成注释
方法一:Eclipse中设置在创建新类时自动生成注释 windows-->preference Java-->Code Style-->Code Templates code--&g ...
- 函数buf_page_init_for_read
/********************************************************************//** Function which inits a pag ...