• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++设计模式之建造者模式

C++设计模式之建造者模式

作者:果冻想 字体:[增加 减小] 来源:互联网 时间:2017-05-28

果冻想 通过本文主要向大家介绍了c++设计模式,c++设计模式pdf,c++设计模式视频教程,c++设计模式视频,c++设计模式面试题等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

建造者模式

在GOF的《设计模式 可复用面向对象软件的基础》中是这样说的:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

这句话,似懂非懂的。一个复杂对象的创建,其通常是由很多的子对象构成;如果一个对象能够直接就创建好了,那么也不会称之为复杂对象。由于项目中需求的变化,这个复杂对象的各个部分经常会发生剧烈的变化,但是,不管怎么变化,将它们组合在一起,组成一个复杂的对象的事实是不会变的。建造者模式就提供了一种“封装机制”来将各个对象的变化隔离开,最终,组合成复杂对象的过程是不会变的。

在《大话设计模式》一书中,例举了一个很好的例子————建造小人。建造一个小人,要分为六步:头部、身体、左手、右手、左脚和右脚。与抽象工厂模式不同的是,建造者模式是在Director的控制下一步一步的构造出来的,在建造的过程中,建造者模式可以进行更精细的控制。不管人的头部、身体、左手、右手、左脚或者右脚如何变化,但是最终还是由这几部分组合在一起形成一个人,虽然是同一个建造过程,但是这个人就会有不同的表示,比如,胖子,瘦子,个高的,个低的等等。

UML图

类图如下:

时序图如下:

代码实现

/*
** FileName     : BuilderPattern
** Author       : Jelly Young
** Date         : 2013/11/22
** Description  : More information, please go to http://www.weikejianghu.com
*/
 
#include <iostream>
using namespace std;
 
typedef enum MANTYPETag
{
    kFatMan,
    kThinMan,
    kNormal
}MANTYPE;
 
class Man
{
public:
    void SetHead(MANTYPE type){ m_Type = type; }
    void SetBody(MANTYPE type){ m_Type = type; }
    void SetLeftHand(MANTYPE type){ m_Type = type; }
    void SetRightHand(MANTYPE type){ m_Type = type; }
    void SetLeftFoot(MANTYPE type){ m_Type = type; }
    void SetRightFoot(MANTYPE type){ m_Type = type; }
    void ShowMan()
    {
        switch (m_Type)
        {
        case kFatMan:
            cout<<"I'm a fat man"<<endl;
            return;
 
        case kThinMan:
            cout<<"I'm a thin man"<<endl;
            return;
 
        default:
            cout<<"I'm a normal man"<<endl;
            return;
        }
    }
 
private:
    MANTYPE m_Type;
};
 
// Builder
class Builder
{
public:
    virtual void BuildHead(){}
    virtual void BuildBody(){}
    virtual void BuildLeftHand(){}
    virtual void BuildRightHand(){}
    virtual void BuildLeftFoot(){}
    virtual void BuildRightFoot(){}
    virtual Man *GetMan(){ return NULL; }
};
 
// FatManBuilder
class FatManBuilder : public Builder
{
public:
    FatManBuilder(){ m_FatMan = new Man(); }
    void BuildHead(){ m_FatMan->SetHead(kFatMan); }
    void BuildBody(){ m_FatMan->SetBody(kFatMan); }
    void BuildLeftHand(){ m_FatMan->SetLeftHand(kFatMan); }
    void BuildRightHand(){ m_FatMan->SetRightHand(kFatMan); }
    void BuildLeftFoot(){ m_FatMan->SetLeftFoot(kFatMan); }
    void BuildRightFoot(){ m_FatMan->SetRightFoot(kFatMan); }
    Man *GetMan(){ return m_FatMan; }
 
private:
    Man *m_FatMan;
};
 
// ThisManBuilder
class ThinManBuilder : public Builder
{
public:
    ThinManBuilder(){ m_ThinMan = new Man(); }
    void BuildHead(){ m_ThinMan->SetHead(kThinMan); }
    void BuildBody(){ m_ThinMan->SetBody(kThinMan); }
    void BuildLeftHand(){ m_ThinMan->SetLeftHand(kThinMan); }
    void BuildRightHand(){ m_ThinMan->SetRightHand(kThinMan); }
    void BuildLeftFoot(){ m_ThinMan->SetLeftFoot(kThinMan); }
    void BuildRightFoot(){ m_ThinMan->SetRightFoot(kThinMan); }
    Man *GetMan(){ return m_ThinMan; }
 
private:
    Man *m_ThinMan;
};
 
// Director
class Director
{
public:
    Director(Builder *builder) { m_Builder = builder; }
    void CreateMan();
 
private:
    Builder *m_Builder;
};
 
void Director::CreateMan()
{
    m_Builder->BuildHead();
    m_Builder->BuildBody();
    m_Builder->BuildLeftHand();
    m_Builder->BuildRightHand();
    m_Builder->BuildLeftHand();
    m_Builder->BuildRightHand();
}
 
int main(int argc, char *argv[])
{
    Builder *builderObj = new FatManBuilder();
    Director directorObj(builderObj);
    directorObj.CreateMan();
    Man *manObj = builderObj->GetMan();
    if (manObj == NULL)
        return 0;
 
    manObj->ShowMan();
    delete builderObj;
    builderObj = NULL;
 
    return 0;
};
</div>

上面这个例子比较杂,但是也是建造者模式的应用。下面这个例子是建造者最一般,最简单的实现方法:

/*
** FileName     : BuilderPattern
** Author       : Jelly Young
** Date         : 2013/11/23
** Description  : More information, please go to http://www.weikejianghu.com
*/
 
#include <iostream>
#include <vector>
using namespace std;
 
class Builder;
 
// Product
class Product<

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 深入理解C++之策略模式
  • C++设计模式之工厂模式
  • C++设计模式编程中简单工厂与工厂方法模式的实例对比
  • 详解C++设计模式编程中对访问者模式的运用
  • 深入解析C++设计模式编程中解释器模式的运用
  • C++设计模式编程之Flyweight享元模式结构详解
  • 详解C++设计模式编程中责任链模式的应用
  • C++设计模式编程中使用Bridge桥接模式的完全攻略
  • C++设计模式编程中的迭代器模式应用解析
  • 深入剖析设计模式中的组合模式应用及在C++中的实现

相关文章

  • 2017-05-28减小VC6编译生成的exe文件的大小的方法
  • 2017-05-28C++访问注册表获取已安装软件信息列表示例代码
  • 2017-05-28一个快速排序算法代码分享
  • 2017-05-28完全掌握C++编程中构造函数使用的超级学习教程
  • 2017-05-28php正则表达式的基本语法总结
  • 2017-05-28基于C语言string函数的详解
  • 2017-05-28do...while(0)的妙用详细解析
  • 2017-05-28OpenCV 2.4.3 C++ 平滑处理分析
  • 2022-04-30C语言函数指针(指向函数的指针)详解
  • 2017-05-28虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 详解C++中的const关键字及与C语言中const的区别
    • 详解C语言中的内存四区模型及结构体对内存的使用
    • C语言 函数指针(指向函数的指针)详解
    • C++将CBitmap类中的图像保存到文件的方法
    • C++实现简单的学生管理系统
    • c异或运算 c异或运算符号
    • C语言实现统计字符串单词数
    • C++中回调函数(CallBack)的用法分析
    • 浅析C语言中strtol()函数与strtoul()函数的用法
    • 详解设计模式中的模板方法模式及在C++中的使用

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有