建造者模式

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;
}
相关推荐
瞌睡不来38 分钟前
(刷题记录5)盛最多水的容器
c++·笔记·学习·题目记录
何陈陈1 小时前
【Linux】线程池
linux·服务器·开发语言·c++
夏旭泽1 小时前
C-include
开发语言·c++
感谢地心引力1 小时前
【Qt】Qt安装(2024-10,QT6.7.3,Windows,Qt Creator 、Visual Studio、Pycharm 示例)
c++·windows·python·qt·visual studio
T0uken2 小时前
【QT Quick】C++交互:调用QML函数
c++·qt·交互
Two_brushes.2 小时前
C++ list 容器类的模拟实现
开发语言·c++·list
王俊山IT3 小时前
C++学习笔记----8、掌握类与对象(五)---- 嵌套类与类中枚举
开发语言·c++·笔记·学习
心怀花木3 小时前
【算法】双指针
c++·算法
闫铁娃3 小时前
二分解题的奇技淫巧都有哪些,你还不会吗?
c语言·数据结构·c++·算法·leetcode
T0uken4 小时前
【QT Quick】C++交互:QML对象操作
c++·qt·交互