设计模式-创建型模式之-建造者模式

  建造者模式,也叫做生成器模式,是一种对象创建型模式。建造者模式用于创建具有多个部件的复合对象,并隐藏了复合对象的创建过程,不同的部件建造者(Builder生成器)有不同的建造方法。通过建造者模式实现了对象的构建和对象的表示的分离,也就是说,通过同样的构建过程(建造逻辑)可以创建出不同的表示(使用不同的建造者产生不同的建造方式)。

建造者模式中的4种角色:

  • 抽象建造者角色Builder:为建造各个组件提供统一的抽象接口;
  • 具体建造者角色ConcreteBuilder:实现抽象建造者提供的抽象接口,定义各个组件的建造方法,是组件建造的具体实施者;
  • 指挥者Director:调用具体建造者来建造产品的各个组件,指挥者并不知道产品的具体信息,指挥者只负责规定并保证各个组件的建造过程和建造逻辑(指挥建造的过程,比如产品的生产工艺有工序要求);
  • 产品角色Product:被建造的复杂对象,包含组合对象的各个部件;

下面以KFC的套餐为例,假设客户点餐后,由机器完成捡餐打包。首先就是产品角色,定义一个类描述KFC套餐:

//最终产品:KFC套餐
class KFCMealSet
{
public:
    void setStaple(const std::string &s)
    {
        staple = s;
    }

    void setSnack(const std::string &s)
    {
        snack = s;
    }

    void setdrink(const std::string &d)
    {
        drink = d;
    }

    void showDetail()
    {
        std::cout << "staple:" << staple << std::endl;
        std::cout << "snack:" << snack << std::endl;
        std::cout << "snack:" << snack << std::endl;
    }

private:
    std::string staple; //主食
    std::string snack;  //小吃
    std::string drink;  //饮料
};

然后是抽象的建造者角色

//建造者基类:抽象出来的套餐打包机器
class MealSetBuilder
{
public:
    virtual void stapleBuilder() = 0;        //主食创建接口
    virtual void snackBuilder() = 0;         //小吃创建接口
    virtual void drinkBuilder() = 0;         //饮料创建接口
    virtual KFCMealSet *getMealSet() = 0; //返回创建好的套餐
};

接着是具体的创建者,这里定义了两个套餐创建类,一个是巨无霸,一个是鸡腿堡:

//巨无霸套餐
class JuWuBaMealSet : public MealSetBuilder
{
public:
    JuWuBaMealSet()
    {
        mealSet = new KFCMealSet();
    }

    ~JuWuBaMealSet()
    {
        delete mealSet;
    }

    void stapleBuilder() override
    {
        mealSet->setStaple("双层巨堡");
    }

    void snackBuilder() override
    {
        mealSet->setSnack("大份薯条");
    }

    void drinkBuilder() override
    {
        mealSet->setdrink("大杯可乐");
    }

    KFCMealSet *getMealSet() override
    {
        return mealSet;
    }

private:
    KFCMealSet *mealSet;
};

//鸡腿堡套餐
class JiTuiBaoMealSet : public MealSetBuilder
{
public:
    JiTuiBaoMealSet()
    {
        mealSet = new KFCMealSet();
    }

    ~JiTuiBaoMealSet()
    {
        delete mealSet;
    }

    void stapleBuilder() override
    {
        mealSet->setStaple("鸡腿堡");
    }

    void snackBuilder() override
    {
        mealSet->setSnack("中份薯条");
    }

    void drinkBuilder() override
    {
        mealSet->setdrink("中杯可乐");
    }

    KFCMealSet *getMealSet() override
    {
        return mealSet;
    }

private:
    KFCMealSet *mealSet;
};

最后是指挥者角色,它负责使用建造者,按照一定的逻辑把具体的产品生产出来(比如这里套餐制作时,需要按一定的顺序)

//指挥者:负责产品的建造逻辑,因为工序可能是有一定要求的,例如这里饮料应该最后装,避免装的过程中洒出来
class Director
{
public:
    Director(MealSetBuilder *builder)
    {
        mealSetBuilder = builder;
    }

    void builderMethod()
    {
        mealSetBuilder->stapleBuilder();
        mealSetBuilder->snackBuilder();
        mealSetBuilder->drinkBuilder();
    }

private:
    MealSetBuilder *mealSetBuilder;
};

使用方式:

int main()
{
    KFCMealSet *mealSet;
    MealSetBuilder *builder;
    Director *director;

    builder = new JuWuBaMealSet();
    director = new Director(builder);
    director->builderMethod();
    mealSet = builder->getMealSet();
    mealSet->showDetail();

    delete builder;
    delete director;
    return 0;
}
posted @ 2025-06-11 18:38  thammer  阅读(62)  评论(0)    收藏  举报