建造者模式

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;
}
相关推荐
旖旎夜光2 小时前
C++(17)
c++·学习
Larry_Yanan3 小时前
Qt多进程(三)QLocalSocket
开发语言·c++·qt·ui
superman超哥3 小时前
仓颉语言中元组的使用:深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
Lucas555555554 小时前
现代C++四十不惑:AI时代系统软件的基石与新征程
开发语言·c++·人工智能
_MyFavorite_5 小时前
cl报错+安装 Microsoft Visual C++ Build Tools
开发语言·c++·microsoft
charlie1145141915 小时前
现代嵌入式C++教程:C++98——从C向C++的演化(2)
c语言·开发语言·c++·学习·嵌入式·教程·现代c++
zmzb01035 小时前
C++课后习题训练记录Day55
开发语言·c++
李白同学5 小时前
C++:继承
开发语言·c++
k***92165 小时前
【C++】STL详解(九)—priority_queue的使用与模拟实现
开发语言·c++
Hard but lovely6 小时前
C++11: 自定义异常&&标准异常体系&&回顾c异常处理方式
开发语言·c++