设计模式C++实现(3)——建造者模式

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

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


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

[cpp] view plaincopyprint?
  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 plaincopyprint?
  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)——原型模式、模板方法模式 

       本人享有博客文章的版权,转载请标明出处 http://blog.csdn.net/wuzhekai1985


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php tp 模板assign,thinkphp中怎么让assign在另一个模板里使用呢?

比如现在我有a.html和名字为b的控制器,现在我在b控制器里assing(‘b’,$b),那么请问在a.html中怎么调用b控制器中的assign呢?回复讨论(解决方案)代码是这样的Controller:public function a(){$this->display();}public function b(){if(IS_AJAX){$imageD(‘Image’);$b$ima…

【转】详解Windows消息分类以及WM_COMMAND与WM_NOTIFY的区别,以及模拟发送控件通知消息

转自&#xff1a;http://blog.sina.com.cn/s/blog_4b3c1f950100nten.html Windows消息的分类 1. 标准消息&#xff08;队列消息&#xff09; 除WM_COMMAND之外&#xff0c;所有以WM_开头的消息都是标准消息&#xff0c;如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR。…

宽字符串忽略大小写比较的实现(原)

宽字符串忽略大小写比较的实现(原) 孙文涛 2008-07-24 在Mac机器平台上没有wcsicmp 或 wcscasecmp之类的函数实现对宽字符忽略大小写的比较&#xff0c;所以实现了好几种方法。 一个自然的思路是: (1) wcscpy 原字符串到tmp字符串; (2) tolower tmp字符串; (3) 然后调用仅存的w…

有关JAVA考试中数据库的题,javaee期末考试题库,用javaEE编写一个题库系统,要怎么做...

javaEE数据库简单问题。你插入2113数据库的时候是把5261它封装为一4102个对象插入的吗&#xff1f;1653如果封装为一个User对象版的权话(User对象有ID和LEVEL两个属性)ResultSet rs ps.executeQuery();User user new User();if(rs.hasNext()){user rs.next();}关于javaee 中j…

wince下获取mac地址的简单方法!

下&#xff0c;可以通过访问注册表获取mac地址&#xff0c;可是非常可惜的是有些系统的注册表不提供这个键值&#xff0c;另外也可以通过 DeviceIoControl这类函数获得&#xff0c;但是所有方法要么不全面&#xff0c;要么不够简单或者有些平台bsp包根本就不支持&#xff0c;我…

【转】虚拟键码

虚拟键码保存在WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN和WM_SYSKEYUP讯息的wParam参数中。此代码标识按下或释放的键。 中文名 虚拟键码 保存在 WM_KEYDOWN等 程 序 Windows程序 代码标识 按下或释放的键 目录 1 简介2 虚拟键表▪ 完整的虚拟键码表▪ 键盘的扫描码、…

循环赛日程表算法

题目&#xff1a;有n2^k个运动员要进行循环赛。现要设计一个满足以下要求的比赛日程表&#xff1a; &#xff08;1&#xff09;每个选手必须与其他n-1个选手各赛一次 &#xff08;2&#xff09;每个选手一天只能赛一次 &#xff08;3&#xff09;循环赛一共进行n-1天 解题思路&…

js有没有类似php的sleep函数,JavaScript-jQuery有没有类似sleep方法?

cronRun.sleep function(n) {for (var i0,jn*1000;i}}小飞写的function sleep(n) {var start new Date().getTime();while(true) if(new Date().getTime()-start > n) break;}貌似 Date new 的过多啊不过我在我本本上测的 好像不怎么管用&#xff0c;不知道为什么 是不是和…

GetAdaptersInfo获取MAC地址

源代码&#xff1a;#include<atlbase.h>#include<atlconv.h>#include"iphlpapi.h"#pragma comment(lib,"Iphlpapi.lib")int main(int argc,char*argv[]){PIP_ADAPTER_INFO pAdapterInfo;PIP_ADAPTER_INFO pAdapterNULL;DWORD dwRetVal0;pAdapt…

【转】Windows 窗体消息大全(速查)

阅读目录 通用窗口消息滚动条消息按钮控件消息按钮控件通知消息组合框控件消息组合框控件通知消息列表框控件消息列表框控件通知消息DDE消息(Dde.h)工具提示控件消息Rich Edit控件消息(带格式编辑控件)Listview控件消息Listview控件通知消息树控件消息树控件通知消息Header Co…

整数表示

在计算机中&#xff0c;不管程序还是数据都表示为二进制格式。对于我们平常编程常使用的整数有两种类型&#xff0c;一种是无符号整数&#xff0c;另外一种是有符号整数。 相应地&#xff0c;就有两种整数的二进制表达方式。一般我们使用的计算机都是32位,因此对两种整数的二进…

char 转wchar_t 及wchar_t转char

利用widechartomultibyte来转换的函数 通常适合于window平台上使用 #include <tchar.h>#include <windows.h>int _tmain(int argc, _tchar* argv[]){wchar_t pwstr[] l"我是中国人";wchar_t pwstr2[20];char *pcstr (char *)malloc(sizeof(char)*(2 * w…

oracle 12c sql图形化,Oracle 12c PL/SQL程序设计终极指南

Oracle 12c PL/SQL程序设计终极指南作者&#xff1a;孙风栋;王澜;郭晓惠出版日期&#xff1a;2015年06月文件大小&#xff1a;11.73M支持设备&#xff1a;&#xffe5;60.00在线试读适用客户端&#xff1a;言商书局iPad/iPhone客户端&#xff1a;下载 Android客户端&#xff1a…

CSS的语法结构

今天又看了一点书&#xff0c;哎我看书的速度可是够慢的。现摘录下来自己也增强下记忆&#xff0c;反正闲着也是闲着o(∩_∩)o...。 CSS的语法结构 CSS的语法结构由三个部分组成&#xff1a;选择符&#xff0c;(Selector)&#xff0c;属性(Porperty)和值(Value)。 使用方法…

WinCE 控制面板的创建

控制面板的组件,其实就是一个地地道道的DLL文件,所不同的是其后缀名为.CPL而已.控制面板组件对外必须要实现一个CPlApplet接口,其原型为:LONG CALLBACK CPlApplet(HWND hwndCPL,UINT message, LPARAM lParam1, LPARAM lParam2).而在此函数之中,为了使组件正常运作,我们必须要处…

oracle 存储同步,Oracle数据库知识——存储过程篇

在线QQ客服&#xff1a;1922638专业的SQL Server、MySQL数据库同步软件存储过程是一组用于完成特定功能的SQL语句&#xff0c;该语句已编译并存储在数据库中。用户通过指定存储过程的名称并提供参数(如果存储过程具有参数)来执行它。存储过程是数据库中的重要对象。任何设计良好…

【转】C++中的static_cast ,reinterpret_cast的用法和区别

转自&#xff1a;https://www.cnblogs.com/heyonggang/p/3361643.html 原文地址&#xff1a;https://www.cnblogs.com/heyonggang/p/3361643.html 用法&#xff1a;static_cast < type-id > ( expression ) 该运算符把expression转换为type-id类型&#xff0c;但没有运…

使用MvcContrib的FormHelper

MvcContrib的FormHelper提供了三大Helper Html辅助 验证HelperGrid表格Helper下载 下载后将MvcContrib.dll与MvcContrib.Samples.FormHelper.dll引用到Asp.net MVC工程 在Web.Config pages.namespaces加入以下节点 <add namespace"MvcContrib.UI.Tags"/><ad…

WinCE控制面板添加应用程序

WinCE系统中的控制面板和Windows系统中的控制面板原理是一样的&#xff0c;里面就是包含了一些应用程序。WinCE系统的控制面板由Ctlpnl.exe&#xff0c;Control.exe和一些.cpl文件组成&#xff0c;其中Ctlpnl.exe和Control.exe用于控制控制面板的文件夹显示和架构&#xff0c;而…

【转】滚动条消息(WM_VSCROLL和WM_HSCROLL)

转自&#xff1a;https://blog.csdn.net/zmq5411/article/details/6756189 &#xff08;1&#xff09;当用户单击滚动条或者是拖动滑块时&#xff0c;Windows会向窗口过程发送WM_VSCROLL消息&#xff08;垂直滚动时&#xff09;或者是WM_HSCROLL消息&#xff08;水平滚动时&am…