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依赖 ...
随机推荐
- windows环境下创建 .文件夹
一.windows环境下创建 .文件夹 1.新建一个文件夹 2.重命名为.properties.(名字前后都加点) 二.windows环境下创建 .文件 1.上面的方法对文件同样适用 2.运行CMD, ...
- ORACLE 数据库 MOD 函数用法
1.求2和1的余数. Select mod(2,1) from dual: 2能被1整除所以余数为0. 2.MOD(x,y)返回X除以Y的余数.如果Y是0,则返回X的值. Select mod(2,0 ...
- 自己瞎捣腾的Win7下Linux安装之路-----图例篇
写在前面 网上很多这方面的教程,我也是参考他们的文章和一些书籍才弄成功.没啥创新性,只为记录下来,以供自已理解和以后复习. 所谓工欲善其事,必先利其器.俺想学习Linux,当然是要先装一个Linux( ...
- 关于css3
1.选择器: 属性选择器:[]; 查找条件:属性:我们可以通过属性来查找[^=][$=][*=][=][attr] 伪类选择器: ::: ::before:::after: 必须指定一个conten ...
- MIT JOS学习笔记03:kernel 02(2016.11.08)
未经许可谢绝以任何形式对本文内容进行转载! 本篇接着上一篇对kernel的分析. (5)pte_t * pgdir_walk(pde_t *pgdir, const void *va, int cre ...
- 创建js对象的属性和方法
按照如下的创建对象的方法,可以节省内存.记录一下方便日后使用 <!Doctype html><html> <head> <title></titl ...
- div四个边框分别设置阴影样式
对于div边框的阴影一直没有很好地理解,也一直不明白怎么给四个边框分别设置阴影.昨天项目中碰到了这个问题,就认真想了一下,在此总结一二. 首先,还是从官方解释说起. 网上的解释通常都是什么水平阴影长度 ...
- 随机函数的代码(srand、rand)
#include<stdio.h> int main() int counter; for(counter=0;counter<10;counter++) { srand(count ...
- $.map和$.extend来复制数组(OA差旅)
$.map:对数组的每个元素调用定义的回调函数并返回包含结果的数组. 对数组用指定的方法. //将原数组中每个元素加 4 转换为一个新数组. //jQuery 代码: $.map( [0,1,2], ...
- Android 启动模式及常用的Intent的Flag
LaunchMode 在声明Activity的xml中指定 android:launchMode="xxx" standard 标准模式.这是系统默认的模式,每次启动Activit ...