设计模式之建造者模式

1、概念

      Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
对象的创建:Builder模式是为对象的创建而设计的模式- 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象- 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法
 class A
{
    private:
     B *b;
}

2、模式中包含的角色及其职责

  

3、使用环境:

      一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离。

4、建造者模式和工厂模式的区别:

     Factory模式中:
     1、有一个抽象的工厂。
      2、实现一个具体的工厂---汽车工厂。
      3、工厂生产汽车A,得到汽车产品A。
     4、工厂生产汽车B,得到汽车产品B。  
           这样做,实现了购买者和生产线的隔离。强调的是结果。      
      Builder模式:
    1、引擎工厂生产引擎产品,得到汽车部件A。
    2、轮胎工厂生产轮子产品,得到汽车部件B。
    3、底盘工厂生产车身产品,得到汽车部件C。
   4、将这些部件放到一起,形成刚好能够组装成一辆汽车的整体。
   5、将这个整体送到汽车组装工厂,得到一个汽车产品。
   这样做,目的是为了实现复杂对象生产线和其部件的解耦。强调的是过程
   两者的区别在于:
Factory模式不考虑对象的组装过程,而直接生成一个我想要的对象。
Builder模式先一个个的创建对象的每一个部件,再统一组装成一个对象。
Factory模式所解决的问题是,工厂生产产品。
而Builder模式所解决的问题是工厂控制产品生成器组装各个部件的过程,然后从产品生成器中得到产品。

5、建造者模式的实现:

     

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

class House
{
public:
    void buildBase(string base)       // 打地基
    {
        _parts.push_back(base);
    }

    void buildWall(string wall)       // 砌墙
    {
        _parts.push_back(wall);
    }

    void buildWindows(string windows) // 安窗户
    {
        _parts.push_back(windows);
    }

    void buildDoor(string d)          // 装门
    {
        _parts.push_back(d);
    }

    void show()
    {
        for (unsigned int i = 0; i < _parts.size(); i++)
            cout << _parts[i] << endl;
    }

private:
    vector<string> _parts;
};

// 抽象的建造者
class  AbsBuilder
{
public:
    virtual void buildBase() = 0;
    virtual void buildWall() = 0;
    virtual void buildWindows() = 0;
    virtual void buildDoor() = 0;
    virtual House *getHouse() = 0;
};

// 盖茅草房的建造者
class WoodBuilder : public AbsBuilder
{
public:
    WoodBuilder()
    {
        ph = new House;
    }
    virtual void buildBase()
    {
        ph->buildBase("茅草房的地基");
    }
    virtual void buildWall()
    {
        ph->buildBase("茅草房的墙");
    }
    virtual void buildWindows()
    {
        ph->buildBase("茅草房的窗户");
    }
    virtual void buildDoor()
    {
        ph->buildBase("茅草房的门");
    }

    House *getHouse()
    {
        return ph;
    }
private:
    House *ph;
};

// 别墅
class VillaBuilder : public AbsBuilder
{
public:
    VillaBuilder()
    {
        ph = new House;
    }
    virtual void buildBase()
    {
        ph->buildBase("别墅的地基");
    }
    virtual void buildWall()
    {
        ph->buildBase("别墅的墙");
    }
    virtual void buildWindows()
    {
        ph->buildBase("别墅的窗户");
    }
    virtual void buildDoor()
    {
        ph->buildBase("别墅的门");
    }

    House *getHouse()
    {
        return ph;
    }
private:
    House *ph;
};


// 指挥者
class Director
{
public:
    Director(AbsBuilder *builder)
    {
        this->builder = builder;
    }

    // 换建造者
    void setBuilder(AbsBuilder *builder)
    {
        this->builder = builder;
    }

    // 建造
    void Concrete()
    {
        builder->buildBase();
        builder->buildWall();
        builder->buildWindows();
        builder->buildDoor();
    }
private:
    AbsBuilder *builder;
};

int main()
{
    AbsBuilder *b1 = new WoodBuilder;   // 工程队
    Director *d = new Director(b1);     // 包工头
    d->Concrete();                      // 指挥造房
    House *h = b1->getHouse();          // 拿房
    h->show();

    cout << "---------------" << endl;
    AbsBuilder *b2 = new VillaBuilder;
    d->setBuilder(b2);
    d->Concrete();
    House *h1 = b2->getHouse();
    h1->show();



    return 0;
}













 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxa1334

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值