23种设计模式 - 建造者模式

server/2025/2/22 11:57:07/

模式定义

建造者模式(Builder Pattern)是一种创建型设计模式,它将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。其核心思想是分步骤构建复杂对象,并通过统一的接口控制构建流程,适用于需要灵活组合复杂组件且构建顺序稳定的场景(如数控系统的多模块配置)。


模式结构

产品(Product):最终要构建的复杂对象(如数控系统),包含多个组件(控制器、传感器等)。
抽象建造者(Builder):定义构建产品各个部件的接口(如buildController()buildSensor())。
具体建造者(Concrete Builder):实现抽象建造者接口,提供具体组件的实现(如西门子、发那科数控系统建造器)。
指挥者(Director):控制构建流程,按顺序调用建造者的方法生成完整产品。


C++示例(数控系统场景)

#include 
#include // 产品类:数控系统
class CNCSystem {
public:void setController(const std::string& controller) {controller_ = controller;}void setSensor(const std::string& sensor) {sensor_ = sensor;}void setDriver(const std::string& driver) {driver_ = driver;}void showConfig() {std::cout << "数控系统配置:\n"<< "- 控制器: " << controller_ << "\n"<< "- 传感器: " << sensor_ << "\n"<< "- 驱动模块: " << driver_ << "\n";}
private:std::string controller_;std::string sensor_;std::string driver_;
};// 抽象建造者
class CNCBuilder {
public:virtual ~CNCBuilder() = default;virtual void buildController() = 0;virtual void buildSensor() = 0;virtual void buildDriver() = 0;virtual CNCSystem getResult() = 0;
};// 具体建造者:西门子系统
class SiemensBuilder : public CNCBuilder {
public:SiemensBuilder() { system_ = CNCSystem(); }void buildController() override {system_.setController("西门子840D控制器");}void buildSensor() override {system_.setSensor("西门子高精度编码器");}void buildDriver() override {system_.setDriver("西门子伺服驱动模块");}CNCSystem getResult() override { return system_; }
private:CNCSystem system_;
};// 具体建造者:发那科系统
class FanucBuilder : public CNCBuilder {
public:FanucBuilder() { system_ = CNCSystem(); }void buildController() override {system_.setController("发那科30i控制器");}void buildSensor() override {system_.setSensor("发那科激光位移传感器");}void buildDriver() override {system_.setDriver("发那科α系列驱动模块");}CNCSystem getResult() override { return system_; }
private:CNCSystem system_;
};// 指挥者:控制构建流程
class Director {
public:void construct(CNCBuilder& builder) {builder.buildController();builder.buildSensor();builder.buildDriver();}
};// 客户端使用
int main() {Director director;SiemensBuilder siemensBuilder;director.construct(siemensBuilder);CNCSystem siemens = siemensBuilder.getResult();siemens.showConfig();FanucBuilder fanucBuilder;director.construct(fanucBuilder);CNCSystem fanuc = fanucBuilder.getResult();fanuc.showConfig();return 0;
}

输出结果

数控系统配置:
控制器: 西门子840D控制器
传感器: 西门子高精度编码器
驱动模块: 西门子伺服驱动模块数控系统配置:
控制器: 发那科30i控制器
传感器: 发那科激光位移传感器
驱动模块: 发那科α系列驱动模块

模式优点

构建与表示分离:客户端无需了解内部组件细节,只需指定建造者类型。
灵活扩展:新增具体建造者即可支持新品牌数控系统(如三菱),无需修改指挥者逻辑。
流程控制:通过指挥者统一管理构建顺序,确保组件装配的稳定性。


应用场景

需要生成的对象具有复杂内部结构(如数控系统的多模块依赖)。
对象的构建过程需要独立于其组成部分(如不同品牌的组件混用)。

通过建造者模式,数控系统的构建过程被标准化,同时支持灵活扩展不同厂商的硬件配置。


http://www.ppmy.cn/server/169834.html

相关文章

DeepSeek VS ChatGPT-速度、准确性和成本

撰写本文时马斯克刚刚发布了聊天机器人Grok2&#xff0c;10万张算卡体现了马斯克的财大气粗。近年来&#xff0c;人工智能模型取得了长足的发展&#xff0c;每个模型都力求在速度、准确性和成本效率方面超越其他模型。在本文中&#xff0c;我将深入研究比较中美在AI的焦点模型上…

什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量数据库? 怎么使用

什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量数据库? 怎么使用 目录 什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量数据库? 怎么使用Embedding(嵌入)RAG(检索增强生成)Function calling(函数调用)Pr…

Linux 高级篇 日志管理、定制自己的Linux系统、备份与恢复

一、日志管理 &#xff08;1&#xff09;基本介绍 日志文件是重要的系统信息文件&#xff0c;记录了如用户登录、系统启动、系统安全、邮件及各种服务等相关重要系统事件在安全方面&#xff0c;日志也至关重要&#xff0c;它能记录系统日常发生的各类事情&#xff0c;可用于检…

网页版的俄罗斯方块

1、新建一个txt文件 2、打开后将代码复制进去保存 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>俄…

网络IP跳动问题解决详

一、问题原因分析 DHCP服务器配置问题: DHCP服务器租期设置过短。 DHCP地址池范围过小&#xff0c;导致地址耗尽。 网络中可能存在多个DHCP服务器&#xff0c;导致IP分配冲突。 网络中存在IP地址冲突: 手动配置的IP地址与DHCP分配的地址冲突。 网络中存在未经授权的DHCP服…

深度学习笔记16-VGG-16算法-Pytorch实现人脸识别

目录 前言 一、 前期准备 1. 设置GPU 2. 导入数据 3. 划分数据集 二、调用官方的VGG-16模型 三、 训练模型 1. 编写训练函数 2. 编写测试函数 3. 设置动态学习率 4. 正式训练 四、 结果可视化 1. Loss与Accuracy图 2. 指定图片进行预测 3. 模型评估 五、总结 前言 &#x1f368…

GB28181协议详解

第一部分&#xff1a;协议基础与设备注册 1.1 协议分层架构 层级协议/规范功能说明信令控制层SIP (RFC 3261) GB扩展设备注册、目录订阅、实时点播、云台控制等控制信令媒体传输层RTP/RTCP (RFC 3550) PS封装音视频数据封装传输&#xff0c;支持H.264/H.265/G.711/AAC等编码…

JavaScript系列(79)--Web Worker 高级应用

Web Worker 高级应用 &#x1f504; Web Worker 为JavaScript提供了真正的多线程能力&#xff0c;让我们能够在后台线程中执行复杂的计算而不阻塞主线程。今天让我们深入探讨Web Worker的高级应用。 Web Worker 概述 &#x1f31f; &#x1f4a1; 小知识&#xff1a;Web Work…