建造者模式

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;
}
相关推荐
beethobe28 分钟前
PythonQt 学习之旅(一):从零构建 C++ 与 Python 的桥梁
c++·python·学习
鹏易灵32 分钟前
C++——2.常量与 const、constexpr 初识详解
java·开发语言·c++
神仙别闹1 小时前
基于C++ 实现 BP 神经网络
开发语言·c++·神经网络
郝学胜-神的一滴1 小时前
CMake 019:程序生成与清理全解析
开发语言·c++·qt·程序人生·软件构建·cmake
c++之路1 小时前
备忘录模式(Memento Pattern)
c++·microsoft
天恩软件2 小时前
一分钟学会 C++ 标准模板库智能指针
c++·智能指针
j7~2 小时前
【C++】STL--Vector容器--拆析解剖Vector的实现以及Vector的底层详解(1)
开发语言·c++·vector·迭代器失效·迭代器的使用
森G2 小时前
76、仿ASIO实现的Linux c++服务器------服务器源码解析----云视频服务项目
c++·qt
TCW11212 小时前
AI底层系列:用C++实现线性代数的公式推导与算法设计-6.线性方程组的解集
c++·人工智能·算法
小欣加油2 小时前
leetcode3612 用特殊操作处理字符串I
数据结构·c++·算法·leetcode·职场和发展