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

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

#include<iostream>
#include <string.h>
using namespace std;
//父类
class Resume
{
protected:char *name;
public:Resume() {}virtual ~Resume() {}virtual Resume* Clone() { return NULL; }virtual void Set(char *n) {}virtual void Show() {}
};class ResumeA : public Resume
{
public:ResumeA(const char *str);  //构造函数ResumeA(const ResumeA &r); //拷贝构造函数~ResumeA();                //析构函数ResumeA* Clone();          //克隆,关键所在void Show();               //显示内容
};
ResumeA::ResumeA(const char *str)
{if(str == NULL) {name = new char[1];name[0] = '\0';}else {name = new char[strlen(str)+1];strcpy(name, str);}
}
ResumeA::~ResumeA() { delete [] name;}
ResumeA::ResumeA(const ResumeA &r) {name = new char[strlen(r.name)+1];strcpy(name, r.name);
}
ResumeA* ResumeA::Clone() {return new ResumeA(*this);
}
void ResumeA::Show() {cout<<"ResumeA name : "<<name<<endl;
}class ResumeB : public Resume
{
public:ResumeB(const char *str);  //构造函数ResumeB(const ResumeB &r); //拷贝构造函数~ResumeB();                //析构函数ResumeB* Clone();          //克隆,关键所在void Show();               //显示内容
};
ResumeB::ResumeB(const char *str)
{if(str == NULL) {name = new char[1];name[0] = '\0';}else {name = new char[strlen(str)+1];strcpy(name, str);}
}
ResumeB::~ResumeB() { delete [] name;}
ResumeB::ResumeB(const ResumeB &r) {name = new char[strlen(r.name)+1];strcpy(name, r.name);
}
ResumeB* ResumeB::Clone() {return new ResumeB(*this);
}
void ResumeB::Show() {cout<<"ResumeB name : "<<name<<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 = r2 = NULL;//深拷贝所以对r3,r4无影响r3->Show(); r4->Show();delete r3; delete r4;r3 = r4 = NULL;
}

原型模式

最近有个招聘会,可以带上简历去应聘了。但是,其中有一家公司不接受简历,而是给应聘者发了一张简历表,上面有基本信息、教育背景、工作经历等栏,让应聘者按照要求填写完整。每个人拿到这份表格后,就开始填写。如果用程序实现这个过程,该如何做呢?一种方案就是用模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。我们的例子中,操作就是填写简历这一过程,我们可以在父类中定义操作的算法骨架,而具体的实现由子类完成。下面给出它的UML图。

其中FillResume() 定义了操作的骨架,依次调用子类实现的函数。相当于每个人填写简历的实际过程。接着给出相应的C++代码。

#include<iostream>
#include <string.h>
using namespace std;
//简历
class Resume
{
protected: //保护成员virtual void SetPersonalInfo() {}virtual void SetEducation() {}virtual void SetWorkExp() {}
public:void FillResume(){SetPersonalInfo();SetEducation();SetWorkExp();}
};
class ResumeA: public Resume
{
protected:void SetPersonalInfo() { cout<<"A's PersonalInfo"<<endl; }void SetEducation() { cout<<"A's Education"<<endl; }void SetWorkExp() { cout<<"A's Work Experience"<<endl; }
};
class ResumeB: public Resume
{
protected:void SetPersonalInfo() { cout<<"B's PersonalInfo"<<endl; }void SetEducation() { cout<<"B's Education"<<endl; }void SetWorkExp() { cout<<"B's Work Experience"<<endl; }
};int main()
{Resume *r1;r1 = new ResumeA();r1->FillResume();delete r1;r1 = new ResumeB();r1->FillResume();delete r1;r1 = NULL;return 0;
}

模板模式

转载于:https://www.cnblogs.com/guxuanqing/p/7881064.html

C++原型模式和模板模式相关推荐

  1. SSM源码分析之23种设计模式(策略模式和模板模式)

    23种设计模式之策略模式和模板模式 目录 策略模式使用场景 策略模式实现 模板模式 目录 策略模式使用场景 策略模式:根据用户的需求处理数据时候需要对算法做出选择,固定的一些算法(不再发生变化的算法) ...

  2. 策略模式、模板模式实战

    设计模式实战第一讲 本篇从实战代码角度详解策略模式.模板模式这两种设计模式. 简介 软件设计模式(Design pattern),又称设计模式,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计 ...

  3. java策略模式模板区别,策略模式与模板模式的区别

    已经很久没更新了,在这期间经历了准备面试.面试.离职又入职的过程,目前已经入职接近2个月,虽说从离职到入职只间隔了4天还包括一个周末.但入职后新工作这段时间还是给我带来了不一样的感悟,抽空我会单独&q ...

  4. 【设计模式】策略模式与模板模式的区别

    文章目录 概述 如何区别 参考 概述 策略模式与模板模式在Spring中都广泛存在: JDBCTemplate.RedisTemplate.MongoTemplate等均是典型的模板模式. Sprin ...

  5. 九、委派模式与模板模式详解

    14.委派模式 14.1.课程目标 1 .掌握委派模式, 精简程序逻辑, 提升代码的可读性. 2.学会用模板方法模式梳理使用工作中流程标准化的业务场景. 14.2.内容定位 1 .希望通过对委派模式的 ...

  6. 【设计模式】【行为型模式】模板模式

    概念 模板模式定义了一个算法的步骤,并允许子类为一个或多个步骤提供其实践方式.让子类在不改变算法架构的情况下,重新定义算法中的某些步骤. 抽象摸板角色:(抽象父类) 定义了一个或多个抽象操作,以便让子 ...

  7. java 模板模式_Java模板模式(Template模式)

    Java模板模式(Template模式) 下一节> Template模式定义:定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中. 其实Java的抽象类本来就是Template模式,因此使 ...

  8. 模板模式--servlet模板模式的应用

    在实际项目中,我们交流的设计模式,普遍指的是基于BoF的23种设计模式, 这23种设计模式 ,所有面向对象语言通用(不仅仅这对java语言) 模板模式是GoF种设计模式的一种,他的功能是将程序执行的流 ...

  9. 设计模式学习笔记(二)工厂模式、模板模式和策略模式的混合使用

    一.工厂模式(Factory pattern) 工厂模式又叫做工厂方法模式,是一种创建型设计模式,一般是在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 1.1 工厂模式介绍 工厂模式是 ...

  10. 拿捏大厂面试,设计模式学习笔记(二)工厂模式、模板模式和策略模式的混合使用

    一.工厂模式 工厂模式又叫做工厂方法模式,是一种创建型设计模式,一般是在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 1.1 工厂模式介绍 工厂模式是Java 中比较常见的一种设计模式 ...

最新文章

  1. 从ReLU到GELU,一文概览神经网络的激活函数
  2. 第7周实践项目2 队列的链式存储结构及其基本运算的实现
  3. [YTU]_2803( 判断字符串是否为回文)
  4. 基于Spring boot 2.1 使用redisson实现分布式锁
  5. Metal之简单渲染动态切换屏幕颜色
  6. 将完整的XP(非PE)安装到U盘
  7. iOS获取label的高度模仿博友
  8. python 赋值、浅拷贝、深拷贝学习实践
  9. Python的Numpy库简述
  10. 某处发现百分百恢复覆盖的分区数据恢复方法(掌握)
  11. 【验证码识别】OpenCV挑战顶象滑动拼图验证码
  12. Maya2011下载 (破解正式版)
  13. java中使用jxls导出excel,excel单元格换行,多sheet页导出
  14. python xlsx转xls_Python将xls转换成xlsx
  15. 中国兰花怎么养 中国兰花养殖方法及注意事项
  16. 人工神经网络有哪些算法,神经网络都有哪些算法
  17. 如何使用微信开发者工具调试在微信端访问的网页
  18. GBC代理“花生漫画PEANUTS”,遭遇侵权账户冻结应该怎么处理?
  19. SQL优化 - Group By 导致的慢sql
  20. 07 Confluent_Kafka权威指南 第七章: 构建数据管道

热门文章

  1. 如何使用BetterZip的压缩密码管理器?
  2. 如何在 Mac 上阻止 FaceTime 通话和 iMessage 信息?
  3. Error fetching https://gems.ruby-china.org/: bad response Not Found 404 (https://gems.ruby-china.or
  4. 新增10亿元作支持 重庆将多举措提升科技创新能力
  5. Vue:列表渲染 v-for on a template
  6. 模拟tomcat连接器
  7. Mac 安装 valet
  8. C# yield简单迭代
  9. JavaScript创建cookie
  10. phpwind8.7升级9.0.1过程(三)20130107升级到20130227