C++ 设计模式:建造者模式(Builder Pattern)

news2025/1/5 6:59:09

链接:C++ 设计模式
链接:C++ 设计模式 - 工厂方法
链接:C++ 设计模式 - 抽象工厂
链接:C++ 设计模式 - 原型模式

建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象。与其他创建型模式不同,建造者模式不仅关注对象的创建,还关注对象的组装过程。

1.问题分析

在软件开发中,有时我们需要创建一个复杂对象,这个对象由多个部分组成,并且这些部分的构建过程可能非常复杂。直接使用构造函数来创建这样的对象会导致代码难以维护和扩展。建造者模式通过将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。

2.实现步骤

  1. 定义产品类:定义一个复杂对象类,该类包含多个部分。
  2. 定义建造者接口:定义一个包含构建各个部分方法的接口。
  3. 实现具体建造者类:实现建造者接口,提供构建各个部分的具体实现。
  4. 定义指挥者类:定义一个指挥者类,用于控制建造过程。
  5. 客户端代码:使用指挥者类和具体建造者类来创建复杂对象。

3.代码示例

3.1.定义产品类

// 机器人类
class Robot {
 public:
  void setHead(const std::string& head) { head_ = head; }
  void setBody(const std::string& body) { body_ = body; }
  void setArms(const std::string& arms) { arms_ = arms; }
  void setLegs(const std::string& legs) { legs_ = legs; }

  void show() const { std::cout << "Robot Parts: " << head_ << ", " << body_ << ", " << arms_ << ", " << legs_ << std::endl; }

 private:
  std::string head_;
  std::string body_;
  std::string arms_;
  std::string legs_;
};

3.2.定义建造者接口

// 建造者接口
class RobotBuilder {
 public:
  virtual ~RobotBuilder() = default;
  virtual void buildHead() = 0;
  virtual void buildBody() = 0;
  virtual void buildArms() = 0;
  virtual void buildLegs() = 0;
  virtual std::unique_ptr<Robot> getResult() = 0;

 protected:
  std::unique_ptr<Robot> robot_ = std::make_unique<Robot>();
};

3.3.实现具体建造者类

// 清洁机器人建造者类
class CleaningRobotBuilder : public RobotBuilder {
 public:
  void buildHead() override { robot_->setHead("Cleaning Head"); }
  void buildBody() override { robot_->setBody("Cleaning Body"); }
  void buildArms() override { robot_->setArms("Cleaning Arms"); }
  void buildLegs() override { robot_->setLegs("Cleaning Legs"); }

  std::unique_ptr<Robot> getResult() override { return std::move(robot_); }
};
// 巡检机器人建造者类
class InspectionRobotBuilder : public RobotBuilder {
 public:
  void buildHead() override { robot_->setHead("Inspection Head"); }
  void buildBody() override { robot_->setBody("Inspection Body"); }
  void buildArms() override { robot_->setArms("Inspection Arms"); }
  void buildLegs() override { robot_->setLegs("Inspection Legs"); }

  std::unique_ptr<Robot> getResult() override { return std::move(robot_); }
};

3.4.定义指挥者类

// 指挥者类
class RobotDirector {
 public:
  void setBuilder(RobotBuilder* builder) { builder_ = builder; }

  std::unique_ptr<Robot> construct() {
    builder_->buildHead();
    builder_->buildBody();
    builder_->buildArms();
    builder_->buildLegs();
    return builder_->getResult();
  }

 private:
  RobotBuilder* builder_;
};

3.5.客户端代码

int main() {
  // 创建具体建造者对象
  CleaningRobotBuilder cleaningBuilder;
  InspectionRobotBuilder inspectionBuilder;

  // 创建指挥者对象并设置建造者
  RobotDirector director;

  // 构建清洁机器人
  director.setBuilder(&cleaningBuilder);
  std::unique_ptr<Robot> cleaningRobot = director.construct();
  cleaningRobot->show();

  // 构建巡检机器人
  director.setBuilder(&inspectionBuilder);
  std::unique_ptr<Robot> inspectionRobot = director.construct();
  inspectionRobot->show();

  return 0;
}

4.总结

  • 建造者模式(Builder Pattern)

    1. 创建过程:指挥者控制对象的创建过程,按特定顺序构建对象。
    2. 目的:将复杂对象的构建过程与其表示分离。
    3. 适用场景:
      • 需要逐步构建复杂对象,并且构建过程可以有不同的表示。
      • 对象由多个部分组成,每个部分可以独立构建。
      • 需要控制对象的创建过程。
  • 工厂模式(Factory Pattern)

    1. 创建过程:工厂决定创建哪个具体对象,创建过程较为简单。
    2. 目的:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
    3. 适用场景:
      • 需要创建的对象类型在运行时才确定。
      • 需要将对象的创建与使用分离。
      • 对象通常是一个整体,创建时不需要逐步构建。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2269902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

word中文献引用[]符号的上下标格式修改

word中文献引用[]符号的上下标格式修改 百度网址 1、查找打开使用通配符&#xff0c;输入[[][0-9]{1,2}[]]&#xff0c;即可匹配所有的字[1],[12]这些字符&#xff0c;然后鼠标点击替换为的空白处&#xff0c;再点击特殊格式–>“字体”&#xff0c;选中上标&#xff0c;最…

在 ArcGIS Pro/GeoScene Pro 中设计专题地图的符号系统

原始 按颜色对面进行符号化 打开符号系统 选择主符号系统 选择字段及其计算方式 更改临界值</

_使用CLion的Vcpkg安装SDL2,添加至CMakelists时报错,编译报错

语言&#xff1a;C20 编译器&#xff1a;gcc 14.2 摘要&#xff1a;初次使用Vcpkg添加SDL2&#xff0c;出现CMakelists找不到错误、编译缺失main错误、运行失败错误。 CMakelists缺失错误&#xff1a; 使用CLion的Vcpkg安装SDL2时&#xff0c;按照指示把对应代码添加至CMakel…

解决Springboot整合Shiro+Redis退出登录后不清除缓存

解决Springboot整合ShiroRedis退出登录后不清除缓存 问题发现问题解决 问题发现 如果再使用缓存管理Shiro会话时&#xff0c;退出登录后缓存的数据应该清空。 依赖文件如下&#xff1a; <dependency><groupId>org.springframework.boot</groupId><arti…

2024-12-29-sklearn学习(26)模型选择与评估-交叉验证:评估估算器的表现 今夜偏知春气暖,虫声新透绿窗纱。

文章目录 sklearn学习(26) 模型选择与评估-交叉验证&#xff1a;评估估算器的表现26.1 计算交叉验证的指标26.1.1 cross_validate 函数和多度量评估26.1.2 通过交叉验证获取预测 26.2 交叉验证迭代器26.2.1 交叉验证迭代器–循环遍历数据26.2.1.1 K 折26.2.1.2 重复 K-折交叉验…

[TOTP]android kotlin实现 totp身份验证器 类似Google身份验证器

背景&#xff1a;自己或者公司用一些谷歌身份验证器或者microsoft身份验证器&#xff0c;下载来源不明&#xff0c;或者有广告&#xff0c;使用不安全。于是自己写一个&#xff0c;安全放心使用。 代码已开源&#xff1a;shixiaotian/sxt-android-totp: android totp authenti…

Windows11 安卓子系统存储位置更改

文章目录 前言 更改存储位置总结 前言 Windows 11 的安卓子系统&#xff08;Windows Subsystem for Android, WSA&#xff09;为用户提供了在 PC 上运行安卓应用的便利&#xff0c;但默认情况下&#xff0c;WSA 的数据存储路径位于系统盘&#xff08;通常是 C 盘&#xff09;。…

家谱管理系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库…

Ubuntu 下使用命令行将 U 盘格式化为 ext4、FAT32 和 exFAT 的详细教程

Ubuntu 下使用命令行将 U 盘格式化为 ext4、FAT32 和 exFAT 的详细教程 作者&#xff1a;Witheart更新时间&#xff1a;20241228 本教程将详细介绍如何将 U 盘格式化为 ext4、FAT32 和 exFAT 文件系统&#xff0c;同时包括如何安装必要工具&#xff08;如 exfat-utils&#x…

基于服务器部署的综合视频安防系统的智慧快消开源了。

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。国产化人工智能“…

Uncaught ReferenceError: __VUE_HMR_RUNTIME__ is not defined

Syntax Error: Error: vitejs/plugin-vue requires vue (>3.2.13) or vue/compiler-sfc to be present in the dependency tree. 第一步 npm install vue/compiler-sfc npm run dev 运行成功&#xff0c;本地打开页面是空白&#xff0c;控制台报错 重新下载了vue-loa…

ChatGPT 与 AGI:人工智能的当下与未来走向全解析

在人工智能的浩瀚星空中&#xff0c;AGI&#xff08;通用人工智能&#xff09;无疑是那颗最为璀璨且备受瞩目的星辰。OpenAI 对 AGI 的定义为“在最具经济价值的任务中超越人类的高度自治系统”&#xff0c;并勾勒出其发展的五个阶段&#xff0c;当下我们大多处于以 ChatGPT 为…

【容器化技术 Docker 与微服务部署】详解

容器化技术 Docker 与微服务部署 一、容器化技术概述 &#xff08;一&#xff09;概念 容器化技术是一种操作系统级别的虚拟化方法&#xff0c;它允许将应用程序及其依赖项&#xff08;如运行时环境、系统工具、库等&#xff09;打包成一个独立的、可移植的单元&#xff0c;这…

SSRF服务端请求Gopher伪协议白盒测试

前言 是什么SSRF&#xff1f; 这个简单点说就是 服务端的请求伪造 就是这个如果是个 请求图片的网站 他的目的是请求外部其他网站的 图片 但是 SSRF指的是让他请求本地的图片 再展示出来 请求的是他的服务器上的图片 SSRF(Server-Side Request Forgery:服务器端请求伪造) …

Diffusion Transformer(DiT)——将扩散过程中的U-Net换成ViT:近频繁用于视频生成与机器人动作预测(含清华PAD详解)

前言 本文最开始属于此文《视频生成Sora的全面解析&#xff1a;从AI绘画、ViT到ViViT、TECO、DiT、VDT、NaViT等》 但考虑到DiT除了广泛应用于视频生成领域中&#xff0c;在机器人动作预测也被运用的越来越多&#xff0c;加之DiT确实是一个比较大的创新&#xff0c;影响力大&…

Paperlib(论文管理工具)

Paperlib 是一个简单好用的论文管理工具。软件接入各学科数据库用于匹配论文元数据&#xff0c;逐步为每一个学科&#xff08;例如计算机科学&#xff0c;物理学等&#xff09;定制化数据库组合提高检索精度。尤其是精准的会议论文元数据检索能力。还可以管理你的论文&#xff…

【Linux】Socket编程-UDP构建自己的C++服务器

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; UDP 网络编程 &#x1f98b; 接口讲解&#x1f98b; V1 版本 - echo server&#x1f98b; V2 版本 - DictServer&#x1f98b; V3 版本 - 简单聊天室 二&a…

嵌入式系统 第七讲 ARM-Linux内核

• 7.1 ARM-Linux内核简介 • 内核&#xff1a;是一个操作系统的核心。是基于硬件的第一层软件扩充&#xff0c; 提供操作系统的最基本的功能&#xff0c;是操作系统工作的基础&#xff0c;它负责管理系统的进程、内存、设备驱动程序、文件和网络系统&#xff0c; 决定着系统的…

[Qt] 信号和槽(1) | 本质 | 使用 | 自定义

目录 一、信号和槽概述 二、本质 底层实现 1. 函数间的相互调用 2. 类成员中的特殊角色 三、使用 四. 自定义信号和槽 1. 基本语法 (1) 自定义信号函数书写规范 (2) 自定义槽函数书写规范 (3) 发送信号 (4) 示例 A. 示例一 B. 示例二 —— 老师说“上课了”&…

2024 年发布的 Android AI 手机都有什么功能?

大家好&#xff0c;我是拭心。 2024 年是 AI 快速发展的一年&#xff0c;这一年 AI 再获诺贝尔奖&#xff0c;微软/苹果/谷歌等巨头纷纷拥抱 AI&#xff0c;多款强大的 AI 手机进入我们的生活。 今年全球 16% 的智能手机出货量为 AI 手机&#xff0c;到 2028 年&#xff0c;这…