一、原理讲解

原型模式其实就是对类对象某个时刻的状态进行备份或者拷贝下来。比如该类的对象进行一系列赋值操作,然后需要保存某个瞬时状态,则用原型模式克隆下来。其中类对象某个瞬时状态用this表示,通过this赋值给*proto,调用该类的拷贝构造函数进行原型拷贝。
注意:函数返回(*this)和(this)区别

  • 函数返回(*this):实际上是返回该类对象的原型或者拷贝(返回值为Proto&或者Proto),返回拷贝时调用的是类的拷贝构造函数Proto::Proto(const
    Proto& proto)
  • 函数返回this:实际上是返回指向类对象的指针

1.1意图

用原型对象创建对象的种类,并且通过拷贝创建新的对象。

1.2应用场景

当一个系统应该独立与他的产品创建、构成和表示时;
当要实例化的类是在运行时指定时,例如,通过动态装载;
为了避免创建一个与产品类层次平行的工厂类层次时;
当一个类的实例只能有几个不同状态组合中的一种时,建立相应数目的原型并克隆他们可能比每次用合适的状态手工实例化该类更方便一些;’

1.3结构图(UML图)

1.4代码实现步骤

a1 定义一个抽象产品接口类IProto,并且定义一个接口函数clone()用于子类继承;(抽象类)
a2 定义一个实现接口类IConcreteProto,重写接口函数clone();(具体产品类)
a3 可以用实现接口类的默认拷贝构造函数,也可以构造自己的拷贝构造函数;

二、实现代码

ProtoPattern.cpp

#include <iostream>using namespace std;#define DELETE(pointer) delete pointer; pointer=nullptrclass IProto
{public:IProto() {}virtual ~IProto() {}virtual IProto* clone() = 0;
};class ConcreteProto : public IProto
{public:ConcreteProto() {}~ConcreteProto() {}virtual IProto* clone()override{return new ConcreteProto(*this); //调用拷贝构造函数备份对象的当前状态}
private:ConcreteProto(const ConcreteProto& proto) { cout << "run copy constructor function!" << endl;}
};void doProtoPattern()
{IProto *pProto1 = new ConcreteProto();IProto *pProto2 = pProto1->clone(); //调用拷贝构造函数备份类对象当前这一刻的状态DELETE(pProto2);DELETE(pProto1);
}

main.cpp

#include <iostream>extern void doProtoPattern();int main()
{doProtoPattern();system("pause");return 1;
}


备注:继承IProto还有另一种写法,不过这种写法调用clone()函数的时候,不会调用拷贝构造函数,而是直接赋值

class ConcreteProtoOther : public IProto
{public:ConcreteProtoOther() { cout << "other" << endl; }~ConcreteProtoOther() {}virtual IProto* clone()override {IProto* proto = new ConcreteProtoOther(); //创建内存并且指向该内存首地址*proto = *this;return proto;}
private:ConcreteProtoOther(const ConcreteProtoOther& proto) { cout << "ConcreteProtoOther run copy constructor function!" << endl; }
};
void doProtoPattern()
{IProto *pProto1 = new ConcreteProtoOther();IProto *pProto2 = pProto1->clone();    //没有调用拷贝构造函数,直接返回了类对象当前这一刻的状态DELETE(pProto2);DELETE(pProto1);
}

三、参考内容

*this和this区别
抽象工厂代码(参考:代码实现)

陈建忠设计模式(参考:哔哩哔哩C++设计模式!!!)

Erich Gamma,Richard Helm.《设计模式 可复用面向对象软件的基础》[M].机械工业出版社,2019:

c++设计模式--原型模式(proto pattern)相关推荐

  1. C++设计模式——原型模式(Prototype Pattern)

    C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...

  2. 设计模式---原型模式(Prototype Pattern)

    在编程中有时候我们会发现,当我们需要一个实例,可是这个实例的创建过程十分复杂,在执行过程中 会消耗大量的时间,同时创建第一个实例和创建第二个时间的初始化信息并未改变.在此种情况下,直接New 一个实例 ...

  3. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...

  4. Java常用设计模式————原型模式(一)

    介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...

  5. 原型模式(Prototype Pattern)

    原型模式(Prototype Pattern) 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

  6. 设计模式-原型模式(克隆羊多利看了都说好)

    文章目录 引例 原型模式 浅拷贝 深拷贝 引例 标题无意冒犯 在介绍原型模式前,我们先从实际问题出发,对比解决方法前后优劣点. 问题: 现在有一只羊(包含属性:名字Dolly.年龄2),需要克隆10只 ...

  7. 设计模式 原型模式_创新设计模式:原型模式

    设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...

  8. 设计模式 原型模式_设计模式:原型

    设计模式 原型模式 创新设计模式之一是原型设计模式 . 尽管原型是创造模式,但它在概念上与其他模式有所区别. 我的意思是原型在某种意义上创造了自己. 我将在下面解释. 原型模式的所有魔力都基于Java ...

  9. 设计模式 原型模式_原型设计模式:创建另一个小车

    设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...

  10. 第六章 Caché 设计模式 原型模式

    文章目录 第六章 Caché 设计模式 原型模式 定义 使用场景 优点 结构图 描述 示例 初级写法 缺点 中级写法 缺点 高级写法 (浅复制) 浅复制 深复制 完整示例 简历类(复制类) 对象类(工 ...

最新文章

  1. ICCV2021 | SMCA:即插即用的共同注意力模型,可使DETR收敛加速10倍
  2. What???你的GitHub爆款项目,面试官可能问都不问
  3. 编程那么苦,学习那么累,这组漫画可以治愈(慢慢品味)
  4. python框架实例_Python之Flask框架项目Demo入门
  5. SICP学习笔记(P27-P28)
  6. Ubuntu 18.04搭建Git服务器
  7. Spring Cloud Alibaba 项目工程准备
  8. 牛客题霸 [子数组的最大累加和问题] C++题解/答案
  9. LeetCode 1165. 单行键盘(哈希)
  10. 任尔东西南北风(洛谷P2689题题解,Java语言描述)
  11. php修罗XiunoBBS轻论坛程序源码开源版
  12. 华为机试——计算字符个数
  13. 原生php使用foreach,php – 使用foreach和session循环 - 程序园
  14. rk3399_android7.1 USB Type-A的配置
  15. wince 播放器 最终版本
  16. 深度学习教程(5) | 深度学习的实用层面(吴恩达·完整版)
  17. python爬取和平精英皮肤_Python——LOL官方商城皮肤信息爬取(一次练手)
  18. c语言弹出文本框,微信小程序弹出文本输入框
  19. JAVA 北京大学GPA计算转换
  20. 10个常用的软件测试工具,你不容错过

热门文章

  1. 用vmware gsx做WINDOWS2000 / windows 2003 的群集
  2. 关于Vue3.0修改title的内容
  3. 全民突击服务器维护多久,全民突击:现在已经没有任何热度,究竟还能坚持多久?...
  4. MySQL最最基础篇
  5. input placeholder添加下划线
  6. Non-linear Optimization
  7. OSTaskCreate()函数分析
  8. 如何在WhatsApp上发送GIF
  9. 短发美女3D建模,高质量女性角色雕刻,老司机带你涨见识~
  10. 如何使用js(jQuery)加载json?