建造者模式(套餐模式)

Posted 顾文繁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了建造者模式(套餐模式)相关的知识,希望对你有一定的参考价值。

这里说建造者模式是一种套餐模式,哈哈哈,套餐指的就是实现建造者抽象类的类。

建造者模式事最复杂的创建型模式,它将客户端与包含多个组成部分的复杂对象的创建过程分类,客户端无需知道内部组成部分与装配方式,只需要知道建造者的类型即可。

定义

该模式用于创建一个包含多个组成部分的复杂对象,可以返回一个完整的对象给用户,即就是给需要创建复杂对象的各个成员变量进行赋值,赋什么值。建造者关注复杂对象如何一个一个创建完成的。而作为使用者,则不关心。

建造者模式包含下面几个角色

1 Builder(抽象建造者)

在该抽象类中,一般有两种函数,一种是构建复杂对象的部分函数buildPart_X,和返回构造结果的getResult函数。相当于我要在KFC里面点一个含有n个食物的套餐,Builder中就要构造这n个食物🍜,把要这个套餐通过定义的函数给构造出来。

2 ConcreteBuilder(具体建造者/具体套餐配方)

这个类实现Builder,具体制定构造什么样的目标对象。相当于KFC里面有一个午餐套餐,但是这个午餐套餐有好多种,每种套餐含有两种食物,第一种套餐是面条+可乐,第二种套餐是米饭+咖啡,第三种套餐是百吉饼+稀饭(实在想不出来中午有啥可吃的)......在该类中实现Builder的函数。

3 Product(目标产品)

Product就是复杂对象,也即是目标产品(上面列子说的KFC里的午餐套餐)。

4 Director(指挥者)

在这个类中,负责将Builder中的函数按照某种次序进行构造,比如先套餐一种,先煮面条,然后再酿造可乐,将这个步骤封装在一个函数construct()中。

类图

下面的类图展示了套餐模式的基本构造。

 KFC生产套餐(C/C++)

下面介绍利用构建者模式进行KFC制造套餐

产品类

//
// Created by wenfan on 2021/6/23.
//

#ifndef PATTERN_DESIGN_PRODUCT_H
#define PATTERN_DESIGN_PRODUCT_H
#include <iostream>
#include <string>
class Product{
public:
    void setFood(const string& food){
        m_food = food;
    }

    void setDrink(const string& drink){
        m_drink = drink;
    }

    void showFood(){
        std::cout << "food : " << m_food << ", drink : " << m_drink << endl;
    }

private:
    string m_food;
    string m_drink;
};

#endif //PATTERN_DESIGN_PRODUCT_H

构建者 

//
// Created by wenfan on 2021/6/23.
//

#ifndef PATTERN_DESIGN_BUILDER_H
#define PATTERN_DESIGN_BUILDER_H
#include "Product.h"

class Builder{
public:
    virtual bool buildFood() = 0;
    virtual bool buildDrink() = 0;
    Product& getResult(){
        std::cout << "Builder正在出餐" << endl;
        return product;
    }
protected:
    Product product;

};

#endif //PATTERN_DESIGN_BUILDER_H

具体构建者(KFC)

//
// Created by wenfan on 2021/6/23.
//

#ifndef PATTERN_DESIGN_KFCBUILDER_H
#define PATTERN_DESIGN_KFCBUILDER_H
#include "Builder.h"

class KFCBuilder : public Builder{
public:
    KFCBuilder(){
        cout << " KFCBuilder 正在创建" << endl;
    }
    virtual bool buildFood(){
        cout << " KFCBuilder 正在制造黄焖鸡米饭" << endl;
        this->product.setFood("黄焖鸡米饭");
    }
    virtual bool buildDrink(){
        cout << " KFCBuilder 正在制造可口可乐" << endl;
        this->product.setDrink("可口可乐");
    }
};

#endif //PATTERN_DESIGN_KFCBUILDER_H

指挥者

//
// Created by wenfan on 2021/6/23.
//

#ifndef PATTERN_DESIGN_DIRECTOR_H
#define PATTERN_DESIGN_DIRECTOR_H


class Director{
public:
    Director(Builder* builder){
        if(builder != nullptr){
            m_builder = builder;
        }
    }
    Product& construct(){
        if(m_builder){
            m_builder->buildDrink();
            m_builder->buildFood();
            return m_builder->getResult();
        }
    }

private:
    Builder* m_builder = nullptr;
};

#endif //PATTERN_DESIGN_DIRECTOR_H

测试

void test_builder(){
    Director director(new KFCBuilder);
    cout <<  "director 开始让KFC制作食物" << endl;
    Product& product = director.construct();
    cout <<  "制作完成" << endl;
    product.showFood();
}

KFC制作结果

 

以上是关于建造者模式(套餐模式)的主要内容,如果未能解决你的问题,请参考以下文章

04-手机套餐:建造者模式

设计模式——建造者模式实例

建造者模式的应用

揭秘设计模式之建造者模式

设计模式-建造者模式

关于建造者模式的个人理解