23种设计模式 - 建造者模式(Builder)

建造者模式(Builder)------ 一步一步拼出来

大白话解释

你去点外卖套餐,可以自己一步步选:

  • 选主食(汉堡 / 鸡腿)
  • 选饮料(可乐 / 橙汁)
  • 选大小(中杯 / 大杯)
  • 要不要加辣

👉 你不是一次性拿到结果,而是一步一步 配置出来

最后点下单,才得到完整套餐。

👉 重点是:

  • 怎么一步步选(构建过程)
  • 最终吃什么 (最终产品)
    是分开的

建造者模式:把一个复杂对象的构建过程拆分成多个步骤,可以用同样的构建步骤创造出不同的对象。重点是------构建过程和最终产品分开。

常见场景:

  • SQL 查询构建器(SELECT * FROM users WHERE id=1 ORDER BY name
  • HTTP 请求构建(设置 URL、Header、Body、超时时间)
  • 游戏角色创建(选职业、装备、技能)
  • 笔记本选配

核心思路

  1. 产品类:最终要创建的复杂对象
  2. 建造者接口:定义所有构建步骤
  3. 具体建造者:实现具体步骤
  4. 指挥者(Director):按顺序调用步骤(可选,用于封装固定套餐)

C++ 代码示例

场景:构建电脑配置,支持"游戏本"和"办公本"两种预设,也支持自定义。

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

// ==============================
// 产品:电脑
// ==============================
struct Computer {
    std::string cpu;
    std::string gpu;
    int ramGB = 0;
    int storageGB = 0;
    std::string monitor;

    void describe() const {
        std::cout << "【电脑配置】\n";
        std::cout << "  CPU: " << cpu << "\n";
        std::cout << "  GPU: " << gpu << "\n";
        std::cout << "  内存: " << ramGB << "GB\n";
        std::cout << "  存储: " << storageGB << "GB\n";
        std::cout << "  显示器: " << monitor << "\n";
    }
};

// ==============================
// 建造者接口
// ==============================
class ComputerBuilder {
public:
    virtual ~ComputerBuilder() = default;
    virtual ComputerBuilder& setCPU(const std::string& cpu) = 0;
    virtual ComputerBuilder& setGPU(const std::string& gpu) = 0;
    virtual ComputerBuilder& setRAM(int gb) = 0;
    virtual ComputerBuilder& setStorage(int gb) = 0;
    virtual ComputerBuilder& setMonitor(const std::string& monitor) = 0;
    virtual Computer build() = 0;
};

// ==============================
// 具体建造者
// ==============================
class StandardComputerBuilder : public ComputerBuilder {
private:
    Computer computer;

public:
    ComputerBuilder& setCPU(const std::string& cpu) override {
        computer.cpu = cpu;
        return *this;
    }
    ComputerBuilder& setGPU(const std::string& gpu) override {
        computer.gpu = gpu;
        return *this;
    }
    ComputerBuilder& setRAM(int gb) override {
        computer.ramGB = gb;
        return *this;
    }
    ComputerBuilder& setStorage(int gb) override {
        computer.storageGB = gb;
        return *this;
    }
    ComputerBuilder& setMonitor(const std::string& monitor) override {
        computer.monitor = monitor;
        return *this;
    }
    Computer build() override {
        return computer; // 返回最终产品
    }
};

// ==============================
// 指挥者:封装预设套餐
// ==============================
class ComputerDirector {
public:
    // 游戏本预设
    Computer buildGamingPC(ComputerBuilder& builder) {
        return builder
            .setCPU("Intel i9-13900K")
            .setGPU("NVIDIA RTX 4090")
            .setRAM(32)
            .setStorage(2000)
            .setMonitor("4K 144Hz 曲面显示器")
            .build();
    }

    // 办公本预设
    Computer buildOfficePC(ComputerBuilder& builder) {
        return builder
            .setCPU("Intel i5-13500")
            .setGPU("Intel 核显")
            .setRAM(16)
            .setStorage(512)
            .setMonitor("1080P 普通显示器")
            .build();
    }
};

int main() {
    ComputerDirector director;

    // 用预设套餐
    std::cout << "=== 游戏本 ===\n";
    StandardComputerBuilder gamingBuilder;
    Computer gamingPC = director.buildGamingPC(gamingBuilder);
    gamingPC.describe();

    std::cout << "\n=== 办公本 ===\n";
    StandardComputerBuilder officeBuilder;
    Computer officePC = director.buildOfficePC(officeBuilder);
    officePC.describe();

    // 自定义配置(链式调用)
    std::cout << "\n=== 自定义配置 ===\n";
    StandardComputerBuilder customBuilder;
    Computer customPC = customBuilder
        .setCPU("AMD Ryzen 7 7800X")
        .setGPU("AMD RX 7900 XTX")
        .setRAM(64)
        .setStorage(4000)
        .setMonitor("超宽曲面显示器")
        .build();
    customPC.describe();

    return 0;
}

输出:

复制代码
=== 游戏本 ===
【电脑配置】
  CPU: Intel i9-13900K
  GPU: NVIDIA RTX 4090
  内存: 32GB
  存储: 2000GB
  显示器: 4K 144Hz 曲面显示器

=== 办公本 ===
【电脑配置】
  CPU: Intel i5-13500
  ...

=== 自定义配置 ===
【电脑配置】
  CPU: AMD Ryzen 7 7800X
  ...

优缺点

说明
✅ 优点 构建步骤清晰,可读性好
✅ 优点 同样的步骤可产出不同配置的对象
✅ 优点 链式调用非常优雅
❌ 缺点 需要创建多个建造者类,代码量增加
❌ 缺点 产品结构变化时,建造者也要改

一句话记忆

建造者模式 = 点外卖自定义套餐,一步步选,最后确认下单,拿到你想要的那份。

相关推荐
君主黑暗2 小时前
设计模式-适配器模式
设计模式·适配器模式
小马爱打代码2 小时前
Apache HttpClient 核心设计模式详解
设计模式·apache
bmseven2 小时前
23种设计模式 - 抽象工厂模式(Abstract Factory)
设计模式·抽象工厂模式
木斯佳18 小时前
HarmonyOS 6 三方SDK对接:从半接模式看Share Kit原理——系统分享的运行机制与设计理念
设计模式·harmonyos·架构设计·分享·半接模式
yydonk19 小时前
像 Agent 一样思考:从 Claude Code 架构演进看 AI Agent 工具设计
设计模式
Jackson_Li21 小时前
大多数人对 Claude Code Skills 的理解,在第一步就错了
人工智能·设计模式
似水明俊德1 天前
13-C#.Net-设计模式六大原则-学习笔记
笔记·学习·设计模式·c#·.net
wangchunting1 天前
Java设计模式
java·单例模式·设计模式
孟陬2 天前
国外技术周刊 #3:“最差程序员”带动高效团队、不写代码的创业导师如何毁掉创新…
前端·后端·设计模式