建造者模式

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;
}
相关推荐
老歌老听老掉牙1 小时前
优化样条曲线拟合参数解决三维建模中的截面连续性问题
c++·opencascade·样条曲线
散峰而望1 小时前
【算法竞赛】栈和 stack
开发语言·数据结构·c++·算法·leetcode·github·推荐算法
不爱吃糖的程序媛1 小时前
OpenHarmony 通用C/C++三方库 标准化鸿蒙化适配
c语言·c++·harmonyos
fqbqrr1 小时前
2601C++,导出控制
c++
陌路202 小时前
日志系统7--异步日志的实现
c++
程序员Jared2 小时前
C++11—this_thread
c++·this_thread
mjhcsp2 小时前
C++ Manacher 算法:原理、实现与应用全解析
java·c++·算法·manacher 算法
Z1Jxxx2 小时前
0和1的个数
数据结构·c++·算法
朔北之忘 Clancy3 小时前
2020 年 6 月青少年软编等考 C 语言二级真题解析
c语言·开发语言·c++·学习·青少年编程·题解·尺取法
消失的旧时光-19433 小时前
C++ 中的 auto 与 nullptr:不是语法糖,而是类型系统升级
开发语言·c++