创建型模式之建造者模式实现

概念

Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

对象的创建:Builder模式是为对象的创建而设计的模式- 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象- 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法。

角色和职责

建造者模式结构图
1) Builder:为创建产品各个部分,统一抽象接口。
2) ConcreteBuilder:具体的创建产品的各个部分,部分A, 部分B,部分C。
3) Director:构造一个使用Builder接口的对象。
4) Product:表示被构造的复杂对象。
ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

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

工厂模式和建造者模式区别

Factory模式中:
1、有一个抽象的工厂。
2、实现一个具体的工厂—汽车工厂。
3、工厂生产汽车A,得到汽车产品A。
4、工厂生产汽车B,得到汽车产品B。
这样做,实现了购买者和生产线的隔离。强调的是结果。

Builder模式:
1、引擎工厂生产引擎产品,得到汽车部件A。
2、轮胎工厂生产轮子产品,得到汽车部件B。
3、底盘工厂生产车身产品,得到汽车部件C。
4、将这些部件放到一起,形成刚好能够组装成一辆汽车的整体。
5、将这个整体送到汽车组装工厂,得到一个汽车产品。
这样做,目的是为了实现复杂对象生产线和其部件的解耦。强调的是过程。

两者的区别在于:
Factory模式不考虑对象的组装过程,而直接生成一个我想要的对象。
Builder模式先一个个的创建对象的每一个部件,再统一组装成一个对象。
Factory模式所解决的问题是,工厂生产产品
而Builder模式所解决的问题是工厂控制产品生成器组装各个部件的过程,然后从产品生成器中得到产品
Builder模式不是很常用。模式本身就是一种思想。知道了就可以了。
设计模式就是一种思想。学习一个模式,花上一两个小时把此模式的意思理解了,就够了。其精华的所在会在以后工作的设计中逐渐体现出来。

案例

#include <iostream>
#include <string.h>
using namespace std;

class House
{
public:
    void setFloor(string floor)
    {
        this->m_floor = floor;
    }
    void setWall(string wall)
    {
        this->m_wall = wall;
    }
    void setDoor(string door)
    {
        this->m_door = door;
    }

    string getFloor()
    {
        return m_floor;
    }
    string getWall()
    {
        return m_wall;
    }
    string getDoor()
    {
        return m_door;
    }
private:
    string m_floor;
    string m_wall;
    string m_door;
};

class Builder
{
public:
    virtual void makeFloor() = 0;
    virtual void makeWall() = 0;
    virtual void makeDoor() = 0;
    virtual House *GetHouse() = 0;
};

//公寓
class FlatBuilder :public Builder
{
public:
    FlatBuilder()
    {
        pHouse = new House;
    }
    virtual void makeFloor()
    {
        pHouse->setFloor("FlatDoor");
    }
    virtual void makeWall() 
    {
        pHouse->setWall("FlatWall");
    }
    virtual void makeDoor()
    {
        pHouse->setDoor("FlatDoor");
    }
    virtual House *GetHouse()
    {
        return pHouse;
    }
private:
    House *pHouse;
};

//别墅
class VillaBuilder :public Builder
{
public:
    VillaBuilder()
    {
        pHouse = new House;
    }
    virtual void makeFloor()
    {
        pHouse->setFloor("VillaDoor");
    }
    virtual void makeWall()
    {
        pHouse->setWall("VillaWall");
    }
    virtual void makeDoor()
    {
        pHouse->setDoor("VillaDoor");
    }
    virtual House *GetHouse()
    {
        return pHouse;
    }
private:
    House *pHouse;
};

class Director
{
public:
    void Construct(Builder *builder)
    {
        builder->makeDoor();
        builder->makeWall();
        builder->makeFloor();
    }
};

int main(void)
{
    //客户直接建造房子
    House *pHouse = new House();
    pHouse->setDoor("门");
    pHouse->setFloor("地板");
    pHouse->setWall("墙");
    delete pHouse;

    工程队直接建造房子
    //Builder *builder = new FlatBuilder();
    //builder->makeWall();
    //builder->makeFloor();
    //builder->makeDoor();

    //指挥者(设计师)指挥 工程队 和建房子
    Director *director = new Director();

    //建公寓
    Builder *builder = new FlatBuilder();
    director->Construct(builder);
    House *house = builder->GetHouse();
    cout << house->getFloor().c_str() << endl;
    delete house;
    delete builder;

    //建别墅
    builder = new VillaBuilder();
    director->Construct(builder);
    house = builder->GetHouse();
    cout << house->getFloor().c_str() << endl;
    delete house;
    delete builder;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

tingzhushaohua

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

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

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

打赏作者

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

抵扣说明:

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

余额充值