3、省略指挥者Director的建造者模式

指挥者类Director在建造者模式中扮演非常重要的作用,简单的Director类用于指导具体建造者如何构建产品,它按一定次序调用Builder的buildPartX()方法,控制调用的先后次序,并向客户端返回一个完整的产品对象。Direcotr针对抽象的建造者进行编程,如果需要不同的建造者,只需把建造者传入指挥者类,无需修改之前的代码。

在有些情况下,为了简化系统结构,可以省略指挥者Director,指挥者不再指导产品的创建过程。而是在Builder中提供逐步构建复杂产品对象的construct()方法。

暴风影音播放器是具体的产品,实现代码和上一篇博客一样,这里就不再呈现。有变化的是建造者类,播放模式.h头文件实现代码如下:

#ifndef _PLAY_PATTERN_H_
#define _PLAY_PATTERN_H_
#include <iostream>
#include <string>
#include "Player.h"
using namespace std;//抽象播放模式
class PlayPattern
{
protected://具体产品(播放器)Player * m_pPlayer;
public:PlayPattern(){m_pPlayer = new Player();}~PlayPattern(){if( NULL != m_pPlayer ){delete m_pPlayer;m_pPlayer = NULL;}}//制造播放窗口virtual void BuildWindow() = 0;//制造播放菜单virtual void BuildMenu() = 0;//制造播放列表virtual void BuildPlayList() = 0;//制造播放进度条virtual void BuildControlBar() = 0;//制造收藏列表virtual void BuildCollectList() = 0;//开始建造,封装建造过程Player * StartConstruct(){BuildWindow();BuildMenu();BuildPlayList();BuildControlBar();BuildCollectList();return m_pPlayer;}
};//完整播放模式
class FullPattern : public PlayPattern
{
public:void BuildWindow();void BuildMenu();void BuildPlayList();void BuildControlBar();void BuildCollectList();
};//精简播放模式
class SimplePattern : public PlayPattern
{
public:void BuildWindow();void BuildMenu();void BuildPlayList();void BuildControlBar();void BuildCollectList();
};//记忆播放模式
class MemoryPattern : public PlayPattern
{
public:void BuildWindow();void BuildMenu();void BuildPlayList();void BuildControlBar();void BuildCollectList();
};#endif

指导者类不再指导暴风影音产品对象的创建过程,而是由抽象播放器模式StartConstruct方法来封装播放器产品的创建过程。
    播放模式Cpp文件代码如下:

#include "PlayPattern.h"//制造播放窗口
void FullPattern::BuildWindow()
{m_pPlayer->SetWindow("主界面窗口");
}//制造播放菜单
void FullPattern::BuildMenu()
{m_pPlayer->SetMenu("主菜单");
}//制造播放列表
void FullPattern::BuildPlayList()
{m_pPlayer->SetPlayList("播放列表");
}//制造播放进度条
void FullPattern::BuildControlBar()
{m_pPlayer->SetControlBar("进度条");
}//制造收藏列表,完整播放模式没有收藏列表,内容设为空
void FullPattern::BuildCollectList()
{m_pPlayer->SetCollectList(" ");
}精简模式///void SimplePattern::BuildWindow()
{m_pPlayer->SetWindow("主界面窗口");
}void SimplePattern::BuildMenu()
{m_pPlayer->SetMenu(" ");
}void SimplePattern::BuildPlayList()
{m_pPlayer->SetPlayList(" ");
}void SimplePattern::BuildControlBar()
{m_pPlayer->SetControlBar("进度条");
}void SimplePattern::BuildCollectList()
{m_pPlayer->SetCollectList(" ");
}/记忆模式void MemoryPattern::BuildWindow()
{m_pPlayer->SetWindow("主界面窗口");
}void MemoryPattern::BuildMenu()
{m_pPlayer->SetMenu(" ");
}void MemoryPattern::BuildPlayList()
{m_pPlayer->SetPlayList(" ");
}void MemoryPattern::BuildControlBar()
{m_pPlayer->SetControlBar("进度条");
}void MemoryPattern::BuildCollectList()
{m_pPlayer->SetCollectList("收藏列表");
}

完整播放模式下并不需要建造收藏列表部件,因此把收藏列表的内容设为空,其它情况类型,把不需要建造的部件内容设为空。测试程序实现代码如下:

#include <iostream>
#include "PlayPattern.h"
#include "Player.h"using namespace std;int main()
{Player * pPlayer = NULL;/***********************完整播放模式************************/PlayPattern * pFullPattern = new FullPattern();cout << "完整播放模式:" << endl;pPlayer = pFullPattern->StartConstruct();pPlayer->Display();/***********************精简播放模式************************/SimplePattern * pSimplePattern = new SimplePattern();cout << "精简播放模式:" << endl;pPlayer = pSimplePattern->StartConstruct();pPlayer->Display();/***********************记忆播放模式************************/MemoryPattern * pMemoryPattern = new MemoryPattern();cout << "记忆播放模式:" << endl;pPlayer = pMemoryPattern->StartConstruct();pPlayer->Display();/***********************销毁操作****************************/cout << endl;delete pFullPattern;pFullPattern = NULL;delete pSimplePattern;pSimplePattern = NULL;delete pMemoryPattern;pMemoryPattern = NULL;return 0;
}

编译并执行,结果如下:

此时,StartConstruct()方法定义了其他buildPartX()方法调用的次序,为其他方法的执行提供了一个流程模板,这与我们在后面要学习的模板方法模式非常类似。对Director类的省略方式都不影响系统的灵活性和可扩展性,同时还简化了系统结构,但加重了抽象建造者类的职责,如果StartConstruct()方法较为复杂,待构建产品的组成部分较多,建议还是将StartConstruct()方法单独封装在Director中,这样做更符合“单一职责原则”

C++设计模式之建造者模式(二)相关推荐

  1. 建造者模式java_java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

  2. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  3. C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  4. 学习《图说设计模式》建造者模式

    图说设计模式之建造者模式 1. 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这 ...

  5. java设计模式之建造者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  6. D5:C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  7. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  8. java设计模式 建造模式_理解java设计模式之建造者模式

    理解java设计模式之建造者模式 发布于 2020-12-10| 复制链接 摘记: 建造者模式(Builder Pattern)主要用于"分步骤构建一个复杂的对象",在这其中&qu ...

  9. 建造者模式 php,PHP设计模式之建造者模式定义与用法简单示例

    本文实例讲述了PHP设计模式之建造者模式.分享给大家供大家参考,具体如下: 建造者模式: 将复杂对象的创建过程和表示进行分离(好吧,我也看不懂什么意思1). 来点我人类能听懂的话: 1.在客户端看来需 ...

最新文章

  1. tensorflow 学习笔记-- tf.reduce_max、tf.sequence_mask
  2. 【计算机网络】物理层 : 总结 ( 物理层特性 | 码元速率 | 通信方式 | 数据传输方式 | 信号类型 | 编码与调制 | 奈氏准则 | 香农定理 | 传输介质 | 物理层设备 ) ★★★
  3. MySQL主从复制故障案例一
  4. Selenium常用的8大元素定位方法
  5. api可以主动采集用户数据吗_现在的前端框架全是通过API获得数据,如何记录用户登录状态?...
  6. python 曲线拟合_Python实现数学模型(插值、拟合和微分方程)
  7. Android 优化电池使用时间——确定和监控基座对接状态和类型
  8. Jacob Java程序把Word文档直接转换成Html文件
  9. .NET高级调试 | 通过JIT拦截无侵入调试 C# Emit 生成的动态代码
  10. hadoop安装详细步骤_推荐一个超详细的Hadoop安装教程,已有32万次阅读
  11. STM32项目(二) —— 车灯测试台架
  12. jQuery移出style
  13. mysql6默认什么字符集_mysql默认字符集问题
  14. Windows Server 2008 R2忘记管理员密码后的解决方法
  15. 查看系统使用率命令 vmstat 输出详解!
  16. python画行向日葵_如何用Python画一朵太阳花
  17. Docker-常用基础命令整理
  18. 关系代数至少选修两门课_高中化学:选修三or选修五——一个帮你节省三个月的复习时间的重要选择(本文无图,浮躁慎入)...
  19. 如何练成某一领域的高手
  20. 所有用户登陆后都在桌面上显示计算机图标,如何在Win10桌面上显示计算机.控制面板.网络.用户的文件图标?...

热门文章

  1. 手把手教你玩 MySQL 删库不跑路,直接把 MySQL 的 binlog 玩溜
  2. Mathematical Reflections
  3. Burpsuit在linux下程序界面字体发虚
  4. 网络编程实践陈硕笔记零
  5. 谈谈英国的移动支付和“虚拟银行卡”
  6. 阿里云视频直播详细流程,以及实现效果演示
  7. prism:如何创建一个张具有显著性差异的统计图?
  8. 深度目标检测网络中关于anchor的神之问(配代码详解)(二)
  9. 被微软遗弃的神作《扫雷》,竟然被中国玩家玩出花?
  10. JavaScript流程控制语句