DP书上的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其中有一个词很重要,那就是拷贝。可以说,拷贝是原型模式的精髓所在。举个现实中的例子来介绍原型模式。找工作的时候,我们需要准备简历。假设没有打印设备,因此需手写简历,这些简历的内容都是一样的。这样有个缺陷,如果要修改简历中的某项,那么所有已写好的简历都要修改,工作量很大。随着科技的进步,出现了打印设备。我们只需手写一份,然后利用打印设备复印多份即可。如果要修改简历中的某项,那么修改原始的版本就可以了,然后再复印。原始的那份手写稿相当于是一个原型,有了它,就可以通过复印(拷贝)创造出更多的新简历。这就是原型模式的基本思想。下面给出原型模式的UML图,以刚才那个例子为实例。

原型模式实现的关键就是实现Clone函数,对于C++来说,其实就是拷贝构造函数,需实现深拷贝,下面给出一种实现。

/** @Author: Zhibo Wang* @Date: 2021-04-18 22:09:24* @LastEditTime: 2021-04-18 22:09:28*/#include <bits/stdc++.h>
using namespace std;class Resume
{
protected:char *name;public:Resume();virtual ~Resume();virtual Resume *clone() = 0;virtual void Show() = 0;virtual void Set(char *n);
};class ResumeA : public Resume
{
public:ResumeA(char *m_name);~ResumeA();ResumeA(const ResumeA &m_name);ResumeA *clone();void Show();
};
ResumeA::ResumeA(char *m__name)
{if (m__name == nullptr){name = new char[1];name[0] = '\0';}name = new char[strlen(m__name)];strcpy(name, m__name);
}
ResumeA::ResumeA(const ResumeA &m_name)
{name = new char[strlen(m_name.name) + 1];strcpy(name, m_name.name);
}
ResumeA::~ResumeA()
{if (name){delete[] name;name = NULL;}
}
ResumeA *ResumeA::clone()
{return new ResumeA(*this);
}
void ResumeA::Show()
{cout << "RESUMEA Clone" << endl;
}int main()
{Resume *r1 = new ResumeA("A");// Resume *r2 = new ResumeB("B");Resume *r3 = r1->clone();// Resume *r4 = r2->Clone();// r1->Show(); r2->Show();//删除r1,r2delete r1;// delete r2;r1 = NULL;//深拷贝所以对r3,r4无影响r3->Show();// \r4->Show();delete r3;// delete r4;r3 = NULL;
}

设计模式C++实现(5)——原型模式相关推荐

  1. 设计模式学习系列6 原型模式(prototype)

    原型模式(prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.允许一个对象再创建另外一个新对象的时候根本无需知道任何创建细节,只需要请求圆形对象的copy函数皆可. 1 ...

  2. 设计模式(四)——原型模式详解

    设计模式(四)--原型模式详解 定义 结构 实现 案例 浅克隆 深克隆 定义 原型模式就是用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的对象. 结构 原型模式包含以下角色: ...

  3. 大战设计模式【23】—— 原型模式

    原型模式(Prototype) 设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一.定义 使用原型实例指定创建对象的种 ...

  4. 《游戏程序设计模式》 1.4 - 原型模式

    为什么80%的码农都做不了架构师?>>> 我第一次听到"原型"这个词是在<设计模式>中.今天,好像每个人都在谈论这个词,但是结果并不是在谈论设计模式. ...

  5. 设计模式笔记五:原型模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出 菜鸟教程讲的比较难懂,有篇简洁易懂的博客: http://blog.csdn.net/j ...

  6. 面向对象设计模式纵横谈:Prototype 原型模式(笔记记录)

       有一段时间没写东西了,今天继续把没写完的设计模式写完,今天这堂课是创建型设计模式的最后一堂课,原型设计模式,它同样也是解决了对象在创建的过程中的解耦合的情况,面对变化使代码更稳定,更准确的说是使 ...

  7. 设计模式(六)原型模式

    一.原型模式的作用? 1.基本就是你需要从A的实例得到一份与A内容相同,但是又互不干扰的实例的话,就需要使用原型模式. 2.用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.这个其实和C ...

  8. 设计模式【5】-- 原型模式

    开局一张图,剩下全靠写- 设计模式文章集合:http://aphysia.cn/categories/designpattern 前言 接触过 Spring 或者 Springboot 的同学或许都了 ...

  9. 设计模式之禅【原型模式】

    真刀实枪之原型模式 先发个个性化电子账单来引出今天的主角 个性化服务 一般银行都会要求个性化服务,添加一些个人信息在提示信息之前. 递送的成功率 邮件的递送成功率有一定的要求,由于大批的发送邮件,会被 ...

  10. 《设计模式之禅》-原型模式

    原型模式属于比较简单的设计模式,所以使用次数也非常的多 定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 原型模式的通用代码: public class PrototypeCla ...

最新文章

  1. /etc/bashrc和/etc/profile傻傻分不清楚?
  2. Python实现二叉树的三种深度遍历方法!
  3. SQL中条件和比较关键字Case的使用方法(case的结果就是得到了一个值)
  4. 腾讯云首次公开边缘计算网络开源平台,拥抱5G与万物互联
  5. SAP Spartacus 如何根据 page layout 获得对应支持的 slots
  6. 闲谈简单设计(KISS)疑惑
  7. qt linux webservice,Qt实现访问WebService
  8. [vue] vue变量名如果以_、$开头的属性会发生什么问题?怎么访问到它们的值?
  9. 近 5 亿人的隐私,毁于一位程序员之手?
  10. oracle full table scan,ORACLE优化之执行规划(1) - TABLE FULL SCAN/INDEX FULL SCAN
  11. Python Web开发框架Django
  12. wojilu系统的ORM代码解析-[源代码结构分析,用特性和反射来感知属性-特性介绍篇]...
  13. 密码安全攻防技术精讲
  14. 台式计算机如何连接投影仪,电脑如何链接投影仪_台式电脑主机怎么连接投影仪-win7之家...
  15. 华为存储IE证书挂靠
  16. Python人眼视线追踪系统
  17. android rndis win10,win10系统安装驱动Rndis的教程介绍
  18. mysql触发器大全
  19. MySQL日期和时间函数 整理
  20. 【C++游戏设计】用颜色原理打印平面地图

热门文章

  1. HTTP事务的延迟—TCP的影响
  2. css 宽高自适应的div 元素 如何居中 垂直居中
  3. 窄带物联网有望结束技术应用“碎片化”
  4. ubuntu配置vnc访问
  5. 《用友ERP-U8(8.72版)标准财务模拟实训》——导读
  6. mac osx wine 1.7.5 源码编译方法及中文乱码的解决
  7. IOS开发之表视图(UITableView)
  8. 利用 Cosole 来学习、调试JavaScrip
  9. 中国版的stackoverflow
  10. 洛谷 - P4173 残缺的字符串(多项式匹配字符串-NTT)