软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》(DP)两本书。本文介绍建造者模式的实现。

建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(DP)。《大话设计模式》举了一个很好的例子——建造小人,一共需建造6个部分,头部、身体、左右手、左右脚。与工厂模式不同,建造者模式是在导向者的控制下一步一步构造产品的。建造小人就是在控制下一步步构造出来的。创建者模式可以能更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。下面给出建造者模式的UML图,以建造小人为实例。

对于客户来说,只需知道导向者就可以了,通过导向者,客户就能构造复杂的对象,而不需要知道具体的构造过程。下面给出小人例子的代码实现。

[cpp] view plaincopy print?
  1. class Builder
  2. {
  3. public:
  4. virtual void BuildHead() {}
  5. virtual void BuildBody() {}
  6. virtual void BuildLeftArm(){}
  7. virtual void BuildRightArm() {}
  8. virtual void BuildLeftLeg() {}
  9. virtual void BuildRightLeg() {}
  10. };
  11. //构造瘦人
  12. class ThinBuilder : public Builder
  13. {
  14. public:
  15. void BuildHead() { cout<<"build thin body"<<endl; }
  16. void BuildBody() { cout<<"build thin head"<<endl; }
  17. void BuildLeftArm() { cout<<"build thin leftarm"<<endl; }
  18. void BuildRightArm() { cout<<"build thin rightarm"<<endl; }
  19. void BuildLeftLeg() { cout<<"build thin leftleg"<<endl; }
  20. void BuildRightLeg() { cout<<"build thin rightleg"<<endl; }
  21. };
  22. //构造胖人
  23. class FatBuilder : public Builder
  24. {
  25. public:
  26. void BuildHead() { cout<<"build fat body"<<endl; }
  27. void BuildBody() { cout<<"build fat head"<<endl; }
  28. void BuildLeftArm() { cout<<"build fat leftarm"<<endl; }
  29. void BuildRightArm() { cout<<"build fat rightarm"<<endl; }
  30. void BuildLeftLeg() { cout<<"build fat leftleg"<<endl; }
  31. void BuildRightLeg() { cout<<"build fat rightleg"<<endl; }
  32. };
  33. //构造的指挥官
  34. class Director
  35. {
  36. private:
  37. Builder *m_pBuilder;
  38. public:
  39. Director(Builder *builder) { m_pBuilder = builder; }
  40. void Create(){
  41. m_pBuilder->BuildHead();
  42. m_pBuilder->BuildBody();
  43. m_pBuilder->BuildLeftArm();
  44. m_pBuilder->BuildRightArm();
  45. m_pBuilder->BuildLeftLeg();
  46. m_pBuilder->BuildRightLeg();
  47. }
  48. };

客户的使用方式:

[cpp] view plaincopy print?
  1. int main()
  2. {
  3. FatBuilder thin;
  4. Director director(&thin);
  5. director.Create();
  6. return 0;
  7. }

至此,《设计模式:可复用面向对象软件的基础》一书上的5种创建型模式介绍完了,分别是工厂方法模式、抽象工厂模式、原型模式、建造者模式、单例模式。

设计模式C++实现(1)——工厂模式

设计模式C++实现(4)——单例模式

设计模式C++实现(5)——原型模式、模板方法模式

设计模式C++实现(6)——建造者模式相关推荐

  1. 北风设计模式课程---7、建造者模式

    北风设计模式课程---7.建造者模式 一.总结 一句话总结: 设计模式都是对生活中好的做事方法的一些抽象,使得各司其职,减少出错. 建造者模式可以看做模仿的生活中:设计师,施工队做复杂房子交给客户的场 ...

  2. 设计模式(五)——建造者模式

    设计模式(五)--建造者模式 一.建造者模式简介 1.建造者模式简介 建造者模式将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式和抽象工厂模式在功能上很相似,都是用来 ...

  3. 肝一肝设计模式【四】-- 建造者模式

    系列文章目录 肝一肝设计模式[一]-- 单例模式 传送门 肝一肝设计模式[二]-- 工厂模式 传送门 肝一肝设计模式[三]-- 原型模式 传送门 肝一肝设计模式[四]-- 建造者模式 传送门 肝一肝设 ...

  4. 设计模式(五)——建造者模式详解

    设计模式(五)--建造者模式详解 概述 结构 代码案例 优缺点 使用场景 模式扩展 创建者模式对比 工厂方法模式和建造者模式 抽象工厂模式和建造者模式 概述 建造者模式就是说将一个复杂对象的构建和表示 ...

  5. 大战设计模式【17】—— 建造者模式

    建造者模式(Builder) 设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一.定义 将一个复杂对象的构建与它的表示 ...

  6. 设计模式(4)建造者模式/生成器模式(Builder)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 设计模式(3)抽象工厂模式(Abstract Factory) 源 ...

  7. 设计模式(第四式:建造者模式)

    概念: 建造者模式:将一个结构的建造和它的表示分离,使得同样的建造过程可以创建不同的表示. 实现: 定义书籍接口: public abstract class Book {private Intege ...

  8. 一天一个设计模式之JS实现——建造者模式

    参考文章: java设计模式之建造者模式 一.什么是建造者模式 建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 工厂类模式提供的是创建单个类的模式,而建造者 ...

  9. 《设计模式之禅》-建造者模式

    建造者模式 又称为生成器模式(设计模式之禅 101-112页) 定义: 将一个复杂对象的构建与它的表示分开,使得同样的创建过程可以创建不同的表示 在建造者模式中,有如4个角色 Product 产品类 ...

  10. Android设计模式详解之建造者模式

    前言 Builder模式是一种创建型设计模式. 定义:将一个复杂对象的创建与它的表示分离,使得同样的构造过程可以创建不同的表示. 使用场景: 相同的方法,不同的执行顺序,产生不同的事件结果时: 多个部 ...

最新文章

  1. 单电源运算放大器全波整流电路_几种二极管整流电路原理图解。
  2. python能谢什么_python可以写什么啊
  3. 开源界的 5 大开源许可协议
  4. MySQL数据库索引及失效场景
  5. 慎用PHP $_REQUEST数组
  6. Spring框架学习笔记03:初探Spring——利用注解配置类取代Spring配置文件
  7. pythonfor循环是迭代器吗_[Python] 迭代器是什么?你每天在用的for循环都依赖它!...
  8. 剑指offer——面试题4:替换空格
  9. MyEclipse—如何在MyEclipse中创建servlet3.0
  10. 数据排序pandas
  11. 加载类型库/DLL 时出错。 (Exception from HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY)
  12. 马尔可夫(Markov)不等式
  13. Android 根据名字获取经纬度,Android 根据城市获取经纬度 适配Android 7.0 、Android 8.0...
  14. [Linux]CentOS修改YUM镜像地址提高下载速度
  15. aho-corasick php,基于 Aho-Corasick 算法实现中文全分词
  16. java manager层_在阿里Java大牛们都是这样对Java项目代码分层的
  17. 京东大数据技术白皮书(附下载)
  18. 【哈士奇赠书活动 - 22期】-〖ChatGPT时代:ChatGPT全能应用一本通〗
  19. 性别 图标 css,CSS实现小图标
  20. 国内外企业争食海淘:顺丰布局转运业务

热门文章

  1. ML之LoRBaggingRF:依次利用Bagging、RF算法对泰坦尼克号数据集 (Kaggle经典案例)获救人员进行二分类预测——模型融合
  2. EL之Bagging(DTR):利用DIY数据集(预留30%数据+两种树深)训练Bagging算法(DTR)
  3. 十一、linux文件系统权限详解
  4. goLand工程结构管理
  5. user-agent
  6. 从Activity中返回数据
  7. python 中使用celery
  8. 应用程序文件Android安全分析挑战:运行时篡改Dalvik字节码
  9. ESP8266固件的下载
  10. 蓝牙HCI剖析(三)