设计模式读书笔记(三) Builder(建造者)模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nizihabi/article/details/51810692

一、模式介绍

在平常的时候,我们不管是上KFC还是去买组装电脑,我们都会遇到这样一个现象:就是不管我们的需求怎么变化,我们只要点下了我们想要的餐品,服务员下单完毕之后,不用多久,我们的自定义套餐就上来了。

这其实就是建造者模式的一个具现化,作为装配工,他不管你需要的是劲辣鸡腿堡还是深海鳕鱼堡,不管你要的是甜筒还是圣代,只要给他一份订单,他就能三下五除二地把你的套餐装配好。

引用一下深入浅出设计模式里的话:GOF 给建造模式的定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建 过程可以创建不同的表示。这句话说得很抽象,不好理解,其实它的意思可以理解为:将构 造复杂对象的过程和组成对象的部件解耦。就像攒电脑一样,不管什么品牌的配件,只要兼 容就可以装上;同样,一样的配件,可以有好多组装的方式。这是对降低耦合、提高可复用 性精神的一种贯彻

下面我们看看UML图的表示:

这里写图片描述

对于客户来说,只需知道指导者即可(也就是相当于我们在KFC里面遇到的下单员),通过指导者,客户就能构造复杂的对象(一份套餐)

二、模式实现

假设我们现在有一家大型的快餐连锁店,里面可以提供KFC和MC的套餐,客人根据自己下单来选择套餐。

先新建一个虚拟的建造者类,里面定义了组装套餐的接口,分别是放入汉堡,饮料和薯条

class Builder
{
public:
    Builder(){ cout << "Builder!" << endl; };
    virtual ~Builder(){};
    virtual void BuildPartHamburger() = 0;
    virtual void BuildPartDrink() = 0;
    virtual void BuildPartChips() = 0;
};

下面创建具体的套餐建造者

class KFCBuilder :public Builder
{
public:
    KFCBuilder() :Builder()
    {
        cout << "Welcome to KFC" << endl;
    }
    ~KFCBuilder(){};

    void BuildPartHamburger()
    {
        cout << "KFC Hamburger" << endl;
    }
    void BuildPartDrink()
    {
        cout << "KFC Drink" << endl;
    }
    void BuildPartChips() 
    {
        cout << "KFC Chips" << endl;
    }

};

class MCBuilder :public Builder
{
public:
    MCBuilder() :Builder()
    {
        cout << "Welcome to Mc" << endl;
    }
    ~MCBuilder(){};

    void BuildPartHamburger()
    {
        cout << "Mc Hamburger" << endl;
    }
    void BuildPartDrink()
    {
        cout << "Mc Drink" << endl;
    }
    void BuildPartChips()
    {
        cout << "Mc Chips" << endl;
    }

};

接下来是指导者的角色:

enum ProductType
{
    KFC,
    Mc
};

class Director
{
public:
    Director(ProductType t) :builder(NULL)
    {
        switch (t)
        {
        case ProductType::KFC:
            builder = new KFCBuilder();
            break;
        case ProductType::Mc:
            builder = new MCBuilder();
            break;
        default:
            cout << "No such Product" << endl;
            break;
        }
    }
    ~Director()
    {
        if (builder)
            delete builder;
        builder = NULL;
    }

    void Create()
    {
        builder->BuildPartHamburger();
        builder->BuildPartDrink();
        builder->BuildPartChips();
    }
private:
    Builder *builder;
};

这里面,指导者在Create函数里面指导建造者进行了装配,最后,客户只要告诉指导者他要哪个套餐即可

扫描二维码关注公众号,回复: 3812834 查看本文章
int main()
{
    Director *director = new Director(ProductType::KFC);
    director->Create();
    delete director;
}

输出结果如下:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/nizihabi/article/details/51810692
今日推荐