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依赖 ...
随机推荐
- SQL Server 2008 R2 未能加载文件或程序集Microsoft.SqlServer.Sqm...
错误提示:未能加载文件或程序集“Microsoft.SqlServer.Sqm, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8 ...
- Hive中的排序和分组(对map和reduce的影响,值得一看!)
order by order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)只有一个reducer,会导致当输入规 模较大时,需要较长的计算时间. set ...
- CocoaPods报错:The dependency `Alamofire ` is not used in any concrete target
看到这个错误提示,首先看看自己的版本是不是 OS X EI Capitan,也就是10.10以后的版本,因为这个版本是比较新的版本,网络上找的那些安装cocoapod命令其实有些过时了,特别是创建po ...
- canvas 画字
用canvas画字还是头一回,要想和UI设计的画的一模一样还是真有些苦难,不过现在实现的效果已经很像了. <!--通过字体文件引入字体--><style>@font-face ...
- pwnable simple login
这是一周前做的一道题目,总的来说这道题很简单,当然一开始看了半天没发现溢出点也是十分的惭愧,题目出的很良心,思路就是溢出之后我们可以控制main函数的ebp, 进而在main函数返回时进行漏洞利用. ...
- oracle数据库从入门到精通
oracle产品线围绕企业开发平台的企业开发平台四大组件:unix,weblogic中间件,java编程语言,oracle数据库oracle 开发主要分两类数据库管理:dba数据库编程:分两部分 ...
- LeetCode---Hash Table
299. Bulls and Cows 思路:抽屉法,放进secrets,拿出guess,最终cows = cows - bulls public String getHint(String secr ...
- 首页使用page类完成生成页面内容的大部分工作
fs2在处理异常及资源使用安全方面也有比较大的改善.fs2 Stream可以有几种方式自行引发异常:直接以函数式方式用fail来引发异常.在纯代码里隐式引发异常或者在运算中引发异常,最开始只是我自己浏 ...
- TObject、Pointer、Interface的转换
unit Unit4; )); )); )); //将Obj转为接口 //LInf1 := ITest(Pointer(LObj1)); //无法转换了,丢失了接口信息 ...
- 【python】调用机器喇叭发出蜂鸣声(Beep)
##coding:utf-8 import winsound winsound.Beep(600,6000) #其中600表示声音大小,1000表示发生时长,1000为1秒