C++设计模式-Prototype原型模式
作用:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone), Clone()实现和具体的语言相关,在C++中通过拷贝构造函数实现。
UML图如下:
代码如下:
Prototype.h
#ifndef _PROTOTYPE_H_
#define _PROTOTYPE_H_ /*Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone)
Clone()实现和具体的语言相关,在C++中通过拷贝构造函数实现 作用:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 */ /*Prototype原型基类,定义Clone接口函数
*/
class Prototype
{
protected:
Prototype();
public:
virtual Prototype* Clone() const=;//定义Clone接口,根据不同的派生类来实例化对象
virtual ~Prototype();
}; //派生自Prototype,实现其接口函数
class ConcretePrototype1:public Prototype
{
public:
ConcretePrototype1();//构造函数
~ConcretePrototype1();//析构函数
ConcretePrototype1(const ConcretePrototype1&);//拷贝构造函数
virtual Prototype* Clone() const;//实现基类定义的Clone接口,内部调用拷贝构造函数实现复制功能
}; //派生自Prototype,实现其接口函数
class ConcretePrototype2:public Prototype
{
public:
ConcretePrototype2();//构造函数
~ConcretePrototype2();//析构函数
ConcretePrototype2(const ConcretePrototype2&);//拷贝构造函数
virtual Prototype* Clone() const;//实现基类定义的Clone接口,内部调用拷贝构造函数实现复制功能
}; #endif
Prototype.cpp
#include "Prototype.h"
#include "iostream" using namespace std; ////Prototype
Prototype::Prototype()
{
cout<<"Prototype"<<endl;
} Prototype::~Prototype()
{
cout<<"~Prototype"<<endl;
} //ConcretePrototype1
ConcretePrototype1::ConcretePrototype1()
{
cout<<"ConcretePrototype1"<<endl;
} ConcretePrototype1::~ConcretePrototype1()
{
cout<<"~ConcretePrototype1"<<endl;
} ConcretePrototype1::ConcretePrototype1(const ConcretePrototype1& cp)
{
cout<<"ConcretePrototype1 copy"<<endl;
} Prototype* ConcretePrototype1::Clone() const
{
return new ConcretePrototype1(*this);
} //ConcretePrototype2
ConcretePrototype2::ConcretePrototype2()
{
cout<<"ConcretePrototype2"<<endl;
} ConcretePrototype2::~ConcretePrototype2()
{
cout<<"~ConcretePrototype2"<<endl;
} ConcretePrototype2::ConcretePrototype2(const ConcretePrototype2& cp)
{
cout<<"ConcretePrototype2 copy"<<endl;
} Prototype* ConcretePrototype2::Clone() const
{
return new ConcretePrototype2(*this);
}
main.cpp
#include "Prototype.h"
#include <iostream>
using namespace std; int main()
{
/*原型模式作用:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
Prototype模式重在从自身复制自己创建新类,隐藏(不需知道)对象创建的细节
*/ /*1、用原型实例p1指定创建对象的种类ConcretePrototype1 */
Prototype* p1 = new ConcretePrototype1(); /*2、通过拷贝这些原型创建新的对象 */
Prototype* p2 = p1->Clone(); cout<< "------------------------" << endl; Prototype* p3 = new ConcretePrototype2();
Prototype* p4 = p3->Clone(); cout<< "------------------------" << endl; delete p1;
delete p2;
cout<< "------------------------" << endl; delete p3;
delete p4; return ;
}
Prototype模式和Builder模式、AbstractFactory模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是:Builder模式重在复杂对象的一步步创建(并不直接返回对象),AbstractFactory模式重在产生多个相互依赖类的对象,而Prototype模式重在从自身复制自己创建新类。
C++设计模式-Prototype原型模式的更多相关文章
- 一天一个设计模式——Prototype 原型模式
一.模式说明 看了比较多的资料,对原型模式写的比较复杂,个人的理解就是模型复制,根据现有的类来直接创建新的类,而不是调用类的构造函数. 那为什么不直接调用new方法来创建类的实例呢,主要一个原因是如果 ...
- 设计模式:Prototype 原型模式 - 同学你抄过别人的作业么?-clone()方法的使用
原型模式: 通过某个类的实例来创建对象 使用原型模式的好处: 好处是什么呢?当我们需要多次重复的创建一个类的示例的时候,我们可以使用new但是,new不仅仅耗费内存而且,如果new 某个类的构造方法中 ...
- 5.设计模式----prototype原型模式
原型模式:做到是原型,那肯定是自己本身才是原型,原型模式属于对象的创建模式. 关于原型模式的实现方式分2种: (1)简单形式.(2)登记形式,这两种表现形式仅仅是原型模式的不同实现. package ...
- 设计模式_11_原型模式(prototype)深拷贝、浅拷贝
设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...
- C#设计模式之六原型模式(Prototype)【创建型】
一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...
- C#设计模式之五原型模式(Prototype Pattern)【创建型】
一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...
- C#设计模式(6)——原型模式(Prototype Pattern) C# 深浅复制 MemberwiseClone
C#设计模式(6)——原型模式(Prototype Pattern) 一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创 ...
- 设计模式05: Prototype 原型模式(创建型模式)
Prototype 原型模式(创建型模式) 依赖关系的倒置抽象不应该依赖于实现细节,细节应该依赖于抽象.对所有的设计模式都是这样的. -抽象A直接依赖于实现细节b -抽象A依赖于抽象B,实现细节b依赖 ...
随机推荐
- javascript方法链式调用和构造函数链式调用对比
先说一下方法链:B的实例从A继承了A中的同名方法,如果B的方法重载了A中的方法,B中的重载方法可能会调用A中的重载方法,这种方法称为方法链. 构造函数链:子类的构造函数B()有时需要调用父类的构造函数 ...
- C# .Net中七层架构浅析
Model实体层,DBUtility数据访问抽象类,IDAL数据访问接口层,SQLServerDAL数据访问层,DALFactory数据访问工厂类,BLL业务逻辑层,UI界面层 一.项目名称及描述:( ...
- UVa 712 S树
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 【我是老中医】Win10系统下MATLAB无法正常打开的解决方案
转眼大四了,要开始做毕设了,导师给的题目要用到他之前做的东西,都是MATLAB做的,所以不太熟悉MATLAB的我也得用这玩意儿了,想想自己目前也就大二的DSS实验和大三的AI实验用过MATLAB,当时 ...
- jquery checkbox的相关操作——全选、反选、获得所有选中的checkbox
1.全选 $("#btn1").click(function(){ $("input[name='checkbox']").attr("checked ...
- MySQL 5.7 并行复制实现原理与调优
MySQL 5.7并行复制时代 众所周知,MySQL的复制延迟是一直被诟病的问题之一,然而在Inside君之前的两篇博客中(1,2)中都已经提到了MySQL 5.7版本已经支持“真正”的并行复制功能, ...
- Python>>>创建一个简单的3D场景
首先安装PyOpengl pip install PyOpenGL PyOpenGL_accelerate
- photoshop,黑白转彩色单色
方法一: 打开 色相/饱和度 面板,勾选上 着色, 然后调节 明度 滑块. 方法二: 前面方法的缺点是会将修改直接塌陷到图层,如果想不塌陷,可以使用色相蒙板: 同样勾选 着色
- C#:调用webservice时提示对操作的回复消息正文进行反序列化时出错
主要原因webservice返回值的长度超过readerQuotas中的了maxStringContentLength值,造成返回值截断,不完整,反序列化时出错. <readerQuotas m ...
- Visual Studio并发Qpar优化效果
IOCP客户端的connect线程FOR循环中添加强制并行,1万/S并发connect+send+recv+close,任务管理器使用从60%降到20%. Visual Studio性能监控CPU使用 ...