建造者模式

8.9.3 建造者模式

​ 构建者模式又称为生成器模式,就是将一个复杂生成对象的过程拆分味多个步骤;主要是为了解决构造函数有非常多的可选参数的问题;

c++ 复制代码
class Pizza {
    Pizza(int size) { ...... }
    Pizza(int size, boolean cheese) { ...... }
    Pizza(int size, boolean cheese, boolean pepperoni) { ...... }
    // ......

示例代码:

java 复制代码
// 下面的两个产品尽管没有同样的接口,但却相互关联。
// 一辆汽车可能配备有 GPS 设备、行车电脑和几个座位。不同型号的汽车(运动型轿车、SUV 和敞篷车)可能会安装或启用不同的功能。
class Car is

// 用户使用手册应该根据汽车配置进行编制,并介绍汽车的所有功能。
class Manual is 


// 生成器接口声明了创建产品对象不同部件的方法。
interface Builder is
    method reset()
    method setSeats(......)
    method setEngine(......)
    method setTripComputer(......)
    method setGPS(......)

// 具体生成器类将遵循生成器接口并提供生成步骤的具体实现。你的程序有多个以不同方式实现的生成器变体。
class CarBuilder implements Builder is
    private field car:Car

    // 一个新的生成器实例必须包含一个在后续组装过程中使用的空产品对象。
    constructor CarBuilder() is
        this.reset()

    // reset(重置)方法可清除正在生成的对象。
    method reset() is
        this.car = new Car()

    // 所有生成步骤都会与同一个产品实例进行交互。
    method setSeats(......) is
        // 设置汽车座位的数量。

    method setEngine(......) is
        // 安装指定的引擎。

    method setTripComputer(......) is
        // 安装行车电脑。

    method setGPS(......) is
        // 安装全球定位系统。

    method getProduct():Car is
        product = this.car
        this.reset()
        return product

// 生成器与其他创建型模式的不同之处在于:它让你能创建不遵循相同接口的产品。
class CarManualBuilder implements Builder is
    private field manual:Manual

    constructor CarManualBuilder() is
        this.reset()

    method reset() is
        this.manual = new Manual()

    method setSeats(......) is

    method setEngine(......) is

    method setTripComputer(......) is

    method setGPS(......) is

    method getProduct():Manual is


// 主管只负责按照特定顺序执行生成步骤。其在根据特定步骤或配置来生成产品
class Director is
    method constructSportsCar(builder: Builder) is
        builder.reset()
        builder.setSeats(2)
        builder.setEngine(new SportEngine())
        builder.setTripComputer(true)
        builder.setGPS(true)

    method constructSUV(builder: Builder) is
        // ......


// 客户端代码会创建生成器对象并将其传递给主管,然后执行构造过程。
class Application is

    method makeCar() is
        director = new Director()

        CarBuilder builder = new CarBuilder()
        director.constructSportsCar(builder)
        Car car = builder.getProduct()

        CarManualBuilder builder = new CarManualBuilder()
        director.constructSportsCar(builder)

        Manual manual = builder.getProduct()

示例的代码:

c++ 复制代码
#include <iostream>
#include <string>

// 产品类:汽车
class Car {
public:
    void setBrand(const std::string& brand) {
        m_brand = brand;
    }

    void setColor(const std::string& color) {
        m_color = color;
    }

    void setModel(const std::string& model) {
        m_model = model;
    }

    void display() const {
        std::cout << "Car: " << m_brand << ", " << m_color << ", " << m_model << std::endl;
    }

private:
    std::string m_brand;
    std::string m_color;
    std::string m_model;
};

// 构造者接口
class CarBuilder {
public:
    virtual void buildBrand() = 0;
    virtual void buildColor() = 0;
    virtual void buildModel() = 0;
    virtual Car* getCar() = 0;
};

// 具体构造者:奔驰汽车构造者
class BenzBuilder : public CarBuilder {
public:
    void buildBrand() override {
        m_car->setBrand("Benz");
    }

    void buildColor() override {
        m_car->setColor("Black");
    }

    void buildModel() override {
        m_car->setModel("E-Class");
    }

    Car* getCar() override {
        return m_car;
    }

    BenzBuilder() : m_car(new Car()) {}

private:
    Car* m_car;
};

// 指挥者:负责构建汽车
class Director {
public:
    Director(CarBuilder* builder) : m_builder(builder) {}

    void buildCar() {
        m_builder->buildBrand();
        m_builder->buildColor();
        m_builder->buildModel();
    }

private:
    CarBuilder* m_builder;
};

int main() {
    // 创建奔驰汽车构造者
    BenzBuilder benzBuilder;

    // 创建指挥者
    Director director(&benzBuilder);

    // 构建汽车
    director.buildCar();

    // 获取构建好的汽车
    Car* car = benzBuilder.getCar();

    // 显示汽车信息
    car->display();

    delete car;

    return 0;
}
相关推荐
路过君_P19 分钟前
C++ 算法题解:迷宫寻路
c++·算法·深度优先
止观止20 分钟前
告别“祖传C++”:开启你的现代C++之旅
c++·c++11·c++20·编程思想·现代c++
罗湖老棍子27 分钟前
二维vector完全指南1:从定义到增删改查
数据结构·c++·算法·stl
再卷也是菜28 分钟前
C++篇(22)LRU Cache
数据结构·c++·算法
D_evil__1 小时前
[C++高频精进] 现代C++特性:Lambda表达式
c++
喜欢吃燃面1 小时前
算法竞赛中的堆
c++·学习·算法
松涛和鸣2 小时前
DAY20 Optimizing VS Code for C/C++ Development on Ubuntu
linux·c语言·开发语言·c++·嵌入式硬件·ubuntu
灯厂码农2 小时前
C++文件操作
开发语言·c++
️停云️2 小时前
C++异常与智能指针
开发语言·c++