【设计模式】建造者模式

概念

创建型模式


类图


代码

cpp 复制代码
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Car {
public:
    vector<string> parts;

    void ListParts() const {
        cout << "Car parts: ";
        for (size_t i = 0; i < parts.size(); i++) {
            if (parts[i] == parts.back()) {
                cout << parts[i];
            } else {
                cout << parts[i] << ", ";
            }
        }
        cout << "\n\n";
    }
};

class Manual {
public:
    vector<string> parts;

    void ListParts() const {
        cout << "Manual parts: ";
        for (size_t i = 0; i < parts.size(); i++) {
            if (parts[i] == parts.back()) {
                cout << parts[i];
            } else {
                cout << parts[i] << ", ";
            }
        }
        cout << "\n\n";
    }
};

class Builder {
public:
    virtual ~Builder() = default;
    virtual void Reset() = 0;
    virtual void SetSeats(int num) const = 0;
    virtual void SetEngine(string type) const = 0;
    virtual void SetTripComputer() const = 0;
    virtual void SetGPS() const = 0;
};

class CarBuilder : public Builder {
public:
    CarBuilder() {
        Reset();
    }

    void Reset() override {
        car = new Car();
    }

    void SetSeats(int num) const override {
        car->parts.emplace_back("Seats " + to_string(num));
    }

    void SetEngine(string type) const override {
        car->parts.emplace_back("Engine " + type);
    }

    void SetTripComputer() const override {
        car->parts.emplace_back("TripComputer");
    }

    void SetGPS() const override {
        car->parts.emplace_back("GPS");
    }

    Car* GetProduct() {
        Car* product = car;
        Reset();
        return product;
    }

private:
    Car *car{};
};

class CarManualBuilder : public Builder {
public:
    CarManualBuilder() {
        Reset();
    }

    void Reset() override {
        manual = new Manual();
    }

    void SetSeats(int num) const override {
        manual->parts.emplace_back("Seats M " + to_string(num));
    }

    void SetEngine(string type) const override {
        manual->parts.emplace_back("Engine M " + type);
    }

    void SetTripComputer() const override {
        manual->parts.emplace_back("TripComputer M");
    }

    void SetGPS() const override {
        manual->parts.emplace_back("GPS M");
    }

    Manual* GetProduct() {
        Manual* product = manual;
        Reset();
        return product;
    }

private:
    Manual* manual{};
};

class Director {
public:
    void SetBuilder(Builder* builder) {
        this->builder = builder;
    }

    void ConstructSpotsCar() {
        builder->Reset();
        builder->SetSeats(2);
        builder->SetEngine("Sport");
        builder->SetGPS();
    }

    void ConstructSUV() {
        builder->Reset();
        builder->SetSeats(5);
        builder->SetEngine("SUV");
        builder->SetTripComputer();
        builder->SetGPS();
    }

private:
    Builder* builder;
};

int main(int argc, char *argv[]) {
    Director* director = new Director();

    // Build Cars
    CarBuilder* builder = new CarBuilder();
    director->SetBuilder(builder);

    cout << "Build Sports Car" << endl;
    director->ConstructSpotsCar();
    Car* car = builder->GetProduct();
    car->ListParts();
    delete car;

    cout << "Build SUV Car" << endl;
    director->ConstructSUV();
    car = builder->GetProduct();
    car->ListParts();

    delete builder;


    // Build Car Manuals
    CarManualBuilder* builderM = new CarManualBuilder();
    director->SetBuilder(builderM);

    cout << "Build Sports Car Manual" << endl;
    director->ConstructSpotsCar();
    Manual* manual = builderM->GetProduct();
    manual->ListParts();
    delete manual;

    cout << "Build SUV Car Manual" << endl;
    director->ConstructSUV();
    manual = builderM->GetProduct();
    manual->ListParts();

    delete builderM;
    delete director;

    return 0;
}
相关推荐
scx201310042 分钟前
20260105 莫队总结
c++
沛沛老爹23 分钟前
Web开发者进阶AI:Agent技能设计模式之迭代分析与上下文聚合实战
前端·人工智能·设计模式
Q741_14731 分钟前
海致星图招聘 数据库内核研发实习生 一轮笔试 总结复盘(1) 作答语言:C/C++ 链表 二叉树
开发语言·c++·经验分享·面试·笔试
咔咔咔的35 分钟前
1970. 你能穿过矩阵的最后一天
c++
_OP_CHEN36 分钟前
【从零开始的Qt开发指南】(十九)Qt 文件操作:从 I/O 设备到文件信息,一站式掌握跨平台文件处理
开发语言·c++·qt·前端开发·文件操作·gui开发·qt文件
CSDN_RTKLIB37 分钟前
【std::map】双向迭代器说明
c++·stl
王老师青少年编程41 分钟前
信奥赛C++提高组csp-s之欧拉回路
c++·算法·csp·欧拉回路·信奥赛·csp-s·提高组
No0d1es42 分钟前
2025年12月 GESP CCF编程能力等级认证C++六级真题
c++·青少年编程·gesp·ccf·6级
Terrence Shen1 小时前
【CUDA编程系列】之01
c++·人工智能·深度学习·机器学习
墨有6661 小时前
数学分析栈的出栈顺序:从算法判断到数学本质(卡特兰数初探)
c++·算法·数学建模