大话设计模式之建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,旨在通过将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

在建造者模式中,通常包含以下几个角色:

  1. Director(指挥者):负责使用构建者对象构建产品对象的方法,而不直接参与产品的构建过程。可以理解为客户端与具体构建过程之间的桥梁。
  2. Builder(抽象建造者):定义了构建产品各个部件的抽象方法,具体的构建过程由具体的建造者来实现。
  3. ConcreteBuilder(具体建造者):实现了抽象建造者接口,负责实际构建产品各个部件并组装成最终产品。
  4. Product(产品):要创建的复杂对象,通常由多个部件组成。
cpp 复制代码
#include <iostream>
#include <string>

// 产品类
class Pizza {
public:
    void setDough(const std::string& dough) {
        dough_ = dough;
    }

    void setSauce(const std::string& sauce) {
        sauce_ = sauce;
    }

    void setTopping(const std::string& topping) {
        topping_ = topping;
    }

    void showPizza() {
        std::cout << "Pizza with Dough: " << dough_ << ", Sauce: " << sauce_
                  << ", Topping: " << topping_ << std::endl;
    }

private:
    std::string dough_;
    std::string sauce_;
    std::string topping_;
};

// 抽象建造者类
class PizzaBuilder {
public:
    virtual void buildDough() = 0;
    virtual void buildSauce() = 0;
    virtual void buildTopping() = 0;
    virtual Pizza* getPizza() = 0;
};

// 具体建造者类
class HawaiianPizzaBuilder : public PizzaBuilder {
public:
    void buildDough() override {
        pizza_->setDough("cross");
    }

    void buildSauce() override {
        pizza_->setSauce("mild");
    }

    void buildTopping() override {
        pizza_->setTopping("ham and pineapple");
    }

    Pizza* getPizza() override {
        return pizza_;
    }

    HawaiianPizzaBuilder() {
        pizza_ = new Pizza();
    }

private:
    Pizza* pizza_;
};

// 具体建造者类
class SpicyPizzaBuilder : public PizzaBuilder {
public:
    void buildDough() override {
        pizza_->setDough("pan baked");
    }

    void buildSauce() override {
        pizza_->setSauce("hot");
    }

    void buildTopping() override {
        pizza_->setTopping("pepperoni and salami");
    }

    Pizza* getPizza() override {
        return pizza_;
    }

    SpicyPizzaBuilder() {
        pizza_ = new Pizza();
    }

private:
    Pizza* pizza_;
};

// 指挥者类
class Waiter {
public:
    void setPizzaBuilder(PizzaBuilder* pb) {
        pizzaBuilder_ = pb;
    }

    Pizza* getPizza() {
        return pizzaBuilder_->getPizza();
    }

    void constructPizza() {
        pizzaBuilder_->buildDough();
        pizzaBuilder_->buildSauce();
        pizzaBuilder_->buildTopping();
    }

private:
    PizzaBuilder* pizzaBuilder_;
};

int main() {
    Waiter waiter;

    HawaiianPizzaBuilder hawaiianPizzaBuilder;
    waiter.setPizzaBuilder(&hawaiianPizzaBuilder);
    waiter.constructPizza();
    Pizza* hawaiianPizza = waiter.getPizza();
    hawaiianPizza->showPizza();

    SpicyPizzaBuilder spicyPizzaBuilder;
    waiter.setPizzaBuilder(&spicyPizzaBuilder);
    waiter.constructPizza();
    Pizza* spicyPizza = waiter.getPizza();
    spicyPizza->showPizza();

    delete hawaiianPizza;
    delete spicyPizza;

    return 0;
}

/*
在这个例子中,我们有一个 Pizza 类作为产品类,定义了 Pizza 的属性和展示方法。
然后定义了抽象建造者类 PizzaBuilder,包含了构建 Pizza 各个部件的抽象方法。
接着定义了两个具体建造者类 HawaiianPizzaBuilder 和 SpicyPizzaBuilder,
分别实现了构建不同类型 Pizza 的方法。最后是指挥者类 Waiter,负责指导具体建造者构建 Pizza。
在 main 函数中,我们可以看到通过指挥者指导具体建造者构建 Pizza,
并最终展示出不同类型的 Pizza。
*/

觉得有帮助的话,打赏一下呗。。

相关推荐
程序员JerrySUN6 小时前
设计模式每日硬核训练 Day 14:组合模式(Composite Pattern)完整讲解与实战应用
设计模式·组合模式
碎梦归途6 小时前
23种设计模式-创建型模式之工厂方法模式(Java版本)
java·设计模式·工厂方法模式
XU磊2607 小时前
Java 工厂设计模式详解:用统一入口打造灵活可扩展的登录系统----掌握 Spring 源码的基础第一步
java·设计模式
匹马夕阳7 小时前
java开发中的设计模式之工厂模式
java·设计模式
Pasregret7 小时前
设计模式入门:从 GoF 分类到 SOLID 原则实战
java·设计模式
Light6010 小时前
Python依赖注入完全指南:高效解耦、技术深析与实践落地
python·设计模式·单元测试·fastapi·依赖注入·解耦
都叫我大帅哥11 小时前
代码界的「俄罗斯套娃」:组合模式的嵌套艺术
java·后端·设计模式
渊渟岳14 小时前
为了掌握设计模式,开发了一款Markdown 文本编辑器软件(已开源)
java·设计模式
邪恶的贝利亚17 小时前
设计模式实践:模板方法、观察者与策略模式详解
设计模式·策略模式
匹马夕阳1 天前
Java开发中的设计模式之观察者模式详细讲解
java·观察者模式·设计模式