C++编程建造器设计模式

构造器设计模式

功能和作用

构造器模式用于分离复杂对象的构造与表示。它允许用户通过相同的构造过程创建不同的对象表示,特别适用于需要多个步骤才能完成的对象创建场景。


原理
  1. 抽象与实现分离:将对象的构建步骤抽象到接口中
  2. 分步构造:允许逐步添加对象的组成部分
  3. 最终组装 :通过build()方法返回完整对象

使用场景
  1. 需要创建复杂对象(含多个组成部分)
  2. 构造过程需要不同的实现
  3. 需要分离对象的构造算法与表示
  4. 需要控制对象的创建步骤

为什么这样设计
  1. 封装变化:将构造过程的变化封装在具体构造器中
  2. 开放封闭:新增产品类型只需扩展新构造器
  3. 单一职责:导向器负责构造流程,构造器负责具体实现

优缺点

优点

  1. 构造过程与表示分离
  2. 精细控制构造流程
  3. 符合开闭原则
  4. 代码可读性高

缺点

  1. 增加系统复杂度
  2. 需要创建多个具体构造器类
  3. 产品需为公共接口

使用方式

Director +construct(Builder) <<interface>> Builder +buildPartA() +buildPartB() +getResult() ConcreteBuilder -product: Product +buildPartA() +buildPartB() +getResult() Product +components


时序图

Client Director ConcreteBuilder Product 创建具体构造器 设置构造器 buildPartA() buildPartB() getResult() 返回完整产品 Client Director ConcreteBuilder Product


C++ 实现
cpp 复制代码
#include <iostream>
#include <string>
#include <vector>

// 产品类
class Pizza {
public:
    void addTopping(const std::string& topping) {
        toppings_.push_back(topping);
    }
    void showPizza() {
        std::cout << "Pizza with toppings: ";
        for (const auto& top : toppings_) {
            std::cout << top << " ";
        }
        std::cout << std::endl;
    }
private:
    std::vector<std::string> toppings_;
};

// 抽象构造器
class PizzaBuilder {
public:
    virtual void buildDough() = 0;
    virtual void buildSauce() = 0;
    virtual void buildToppings() = 0;
    virtual Pizza* getPizza() = 0;
    virtual ~PizzaBuilder() {}
};

// 具体构造器
class HawaiianPizzaBuilder : public PizzaBuilder {
public:
    HawaiianPizzaBuilder() { pizza_ = new Pizza(); }
    
    void buildDough() override {
        pizza_->addTopping("Thin Crust");
    }
    
    void buildSauce() override {
        pizza_->addTopping("Tomato Sauce");
    }
    
    void buildToppings() override {
        pizza_->addTopping("Ham");
        pizza_->addTopping("Pineapple");
    }
    
    Pizza* getPizza() override {
        return pizza_;
    }
private:
    Pizza* pizza_;
};

// 导向器
class Cook {
public:
    void makePizza(PizzaBuilder* builder) {
        builder->buildDough();
        builder->buildSauce();
        builder->buildToppings();
    }
};

// 测试代码
int main() {
    Cook cook;
    HawaiianPizzaBuilder hawaiianBuilder;
    
    cook.makePizza(&hawaiianBuilder);
    Pizza* pizza = hawaiianBuilder.getPizza();
    pizza->showPizza();
    
    delete pizza;
    return 0;
}

---
编译运行和测试输出

编译和运行步骤:

  1. 保存代码为builder.cpp
  2. 编译:使用g++编译器(例如:g++ builder.cpp -o build)。
  3. 运行:./build

测试输出:

复制代码
Pizza with topping:Thin Crust Tomato Sauce Ham Pineapple

总结

构造器模式通过分离对象的构造与表示,提供了灵活的复杂对象创建方案。它特别适用于需要分步构造且构造过程可能变化的场景,虽然增加了系统复杂度,但显著提高了代码的可维护性和扩展性。

相关推荐
IT_Octopus3 小时前
IntelliJ 本地日志路径自定义:`-DLOG_PATH=./logs` 为什么总“不听话“
java·log4j·intellij-idea
hansang_IR3 小时前
【题解】P4460 [CQOI2018] 解锁屏幕
c++·算法
长征coder4 小时前
【无标题】
java·性能优化
ChampaignWolf4 小时前
在 SAP S/4HANA 内部基于 ICF Handler 从零实现 ABAP MCP Server:架构、代码与踩坑实录
c++·架构·sap·abap·mcp
新时代牛马4 小时前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
Bs_MoneyMagnet4 小时前
基于springboot+vue的医疗健康便民服务平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
sunshine22 girl5 小时前
Java学习一 环境配置2 Idea的入门使用和maven配置,项目启动脚本配置
java·maven
尘客-追梦5 小时前
Day 01:插件化之前,先看清 ABI 这堵墙
开发语言·c++·qt
有点。6 小时前
*C++哈夫曼树与哈夫曼编码
java·c++·servlet
啦啦啦啦啦zzzz6 小时前
利用RAII机制进行日志的采集
linux·服务器·c++·网络编程·c++20