设计模式学习笔记(C++实现)(四)--建造者模式

1.建造者模式简介

  • 英文名称
    Builder
  • 主要目的
    该模式可以将一个复杂对象的构建和其的表示分离,使得同样的构建过程可以创建不同的表示。
  • 使用场景
    1.当构建复杂对象的算法应该独立于该对象的组成部分以及其装配方式时;
    2.当构建过程必须允许被构建对象有不同的表示时。

2.建造者模式代码示例

  • 测试平台
    1.开发语言:C++
    2.开发工具:VS2015
    3.操作系统:Win7 X64
  • 相关类说明
    1.Computer–产品类,该类一般会有多个部件组成;
    2.Abstract_Builder–抽象构建者类,一般描述产品由哪些部分组成。同时该类还需要声明一个获取构建后产品的接口;
    3.Assember–指挥者类,该类用来定义产品的构建过程。
  • 类图
    这里写图片描述

注意:
1.本例以电脑组装为例,利用建造者模式的概念,来分别组装游戏电脑和办公电脑;
2.该模式的主要特点是新增了一个专门的指挥者类,该类定义了一个产品具体构建过程;
3.该模式的主要好处是使得构建代码与实现代码分离。

  • 具体代码

#include <iostream>
#include <string>
#include <list>
using namespace std;

//产品类,一般有多个部件构成
class Computer
{
public:
    //函数功能:给电脑选择一个配件
    //参数:    string componentName[IN]                   -- 配件名称
    //返回值:  无
    void Select(string componentName)
    {
        this->m_ComponentsList.push_back(componentName);
    }

    //函数功能:显示电脑配件清单
    //参数:    无
    //返回值:  无
    void ShowComponets()
    {
        cout << "该款电脑配置清单如下:" << endl;
        list<string>::iterator iter;
        for (iter=this->m_ComponentsList.begin();iter!=this->m_ComponentsList.end();++iter)
        {
            cout << *iter << endl;
        }
    }
private:
    list<string> m_ComponentsList;                 //电脑配件列表
};

//建造者类
class Abstract_Builder
{
public:
    virtual void BuildCpu() = 0;                  //抽象CPU构建函数
    virtual void BuildMemory() = 0;               //抽象内存构建函数
    virtual void BuildVideoCard() = 0;            //抽线显卡构建函数

    virtual Computer GetComputer() = 0;            //抽象获取产品函数
};

//具体建造者类1,用于构建游戏电脑
class GameComputerBuilder :public Abstract_Builder
{
public:
    void BuildCpu()                             //具体CPU构建函数
    {
        this->m_Computer.Select("I7 8700");
    }

    void BuildMemory()                           //具体内存构建函数
    {
        this->m_Computer.Select("16G 内存");
    }

    void BuildVideoCard()                      //具体显卡构建函数
    {
        this->m_Computer.Select("gtx 1080 ti");
    }

    Computer GetComputer()                      //具体获取产品函数
    {
        return this->m_Computer;
    }
private:
    Computer m_Computer;                        //产品对象
};


//具体建造者类1,用于构建办公电脑
class WorkComputerBuilder :public Abstract_Builder
{
public:
    void BuildCpu()                             //具体CPU构建函数
    {
        this->m_Computer.Select("I5 5400");
    }

    void BuildMemory()                           //具体内存构建函数
    {
        this->m_Computer.Select("8G 内存");
    }

    void BuildVideoCard()                      //具体显卡构建函数
    {
        this->m_Computer.Select("gtx 1050");
    }

    Computer GetComputer()                      //具体获取产品函数
    {
        return this->m_Computer;
    }
private:
    Computer m_Computer;                        //产品对象
};

//指挥者类,用来指挥构建的过程
class Assember
{
public:
    //函数功能:组装电脑
    //参数:    Abstract_Builder builder[IN]                  -- 构建者
    //返回值:  无
    void Assembly(Abstract_Builder* builder)
    {
        builder->BuildCpu();
        builder->BuildMemory();
        builder->BuildVideoCard();
    }
};

int main()
{
    Assember pcAssember;

    //组装游戏电脑
    cout << "组装游戏电脑..." << endl;

    //组装游戏电脑
    Abstract_Builder* pBuilder1 = new GameComputerBuilder();
    if (NULL!= pBuilder1)
    {
        pcAssember.Assembly(pBuilder1);

        Computer pc = pBuilder1->GetComputer();
        pc.ShowComponets();

        delete pBuilder1;
        pBuilder1 = NULL;
    }

    //组装办公电脑
    cout << endl<< "组装办公电脑..." << endl;

    Abstract_Builder* pBuilder2 = new WorkComputerBuilder();
    if (NULL != pBuilder2)
    {
        pcAssember.Assembly(pBuilder2);

        Computer pc = pBuilder2->GetComputer();
        pc.ShowComponets();

        delete pBuilder2;
        pBuilder2 = NULL;
    }   

    getchar();
    return 0;
}
  • 输出结果
    这里写图片描述

栏目导航
上一篇:设计模式学习笔记(C++实现)(三)–抽象工厂模式
下一篇:设计模式学习笔记(C++实现)(五)–原型模式模式

参考文献:
1.《设计模式:可复用面向对象软件的基础》

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值