0

0

c++ 建造者模式实现 c++如何分步构建一个复杂的对象

煙雲

煙雲

发布时间:2026-03-17 19:03:11

|

618人浏览过

|

来源于php中文网

原创

Builder 应持有抽象接口指针(如 std::unique_ptr<Product>),通过虚函数定义构建契约,由 ConcreteBuilder 负责具体实例化;Director 不传参数、不涉业务逻辑,仅顺序调用无参方法;链式调用须返回 Builder& 且由调用方管理生命周期;getResult() 应返回 std::unique_ptr&& 实现所有权转移。

c++ 建造者模式实现 c++如何分步构建一个复杂的对象

Builder 类怎么设计才不和 Product 耦合

直接在 Builder 里 new Product 实例,等于把具体类型写死了,后续换实现或加 mock 就得改所有 builder。正确做法是让 Builder 持有抽象接口指针(比如 std::unique_ptr<productinterface></productinterface>),构造逻辑只调用虚函数,具体类由 ConcreteBuilderbuild() 里 new。

常见错误现象:Builder 头文件里 #include 了具体 Product 的头,编译依赖爆炸,单元测试没法替换成 stub。

  • 用纯虚基类定义构建契约,比如 virtual void set_name(const std::string&) = 0
  • ConcreteBuilder 构造函数接收一个工厂函数或 factory 对象,避免内部 new
  • 如果 Product 是值语义且轻量,也可以用 std::optional<product></product> + move 构造,但要注意拷贝成本

Director 和 Builder 之间要不要传参数

Director 不该知道任何字段名或业务规则,它只负责调用 builder->step1()builder->step2() 这种无参方法。所有输入数据应该在 Director 外部准备好,通过 Builder 构造函数或独立的 configure() 方法注入。

否则会出现:Director 变成业务逻辑中枢,一改就崩;Builder 接口膨胀出一堆 set_xxx(int),失去封装性。

立即学习C++免费学习笔记(深入)”;

ithy
ithy

融合多种AI模型的AI搜索平台

下载
  • 推荐模式:Director(director_config).construct(builder),其中 director_config 是结构体或 JSON 解析结果
  • Builder 内部用成员变量暂存配置,每步操作只读不写外部状态
  • 避免在 Director::construct() 里做 if-else 分支决定调用哪个 step —— 那属于 Builder 的职责

如何支持部分构建和链式调用

链式调用本质是每个 setter 返回 *this,但 C++ 里容易踩两个坑:返回局部对象引用、生命周期错乱。真正安全的做法是让 Builder 方法返回 Builder&,且 Builder 必须由调用方管理生命周期(比如栈上创建)。

常见错误现象:auto b = Builder().name("a").age(12);Builder() 临时对象在分号前就析构,后续调用野指针。

  • 禁止返回临时 Builder 对象的引用,只允许返回已存在实例的引用
  • 如果需要“部分构建后复用”,用 Builder::clone() 返回新实例,而不是共享状态
  • 考虑用 std::move 支持右值链式:让 Builder&& 的方法返回 Builder&&,避免不必要的拷贝

std::shared_ptr 还是 std::unique_ptr 管理 Product

绝大多数场景用 std::unique_ptr 更合适。Builder 的职责是“构建完成即交付”,不该保留对 Product 的长期引用;Director 或调用方拿到后自行决定所有权归属。

shared_ptr 容易掩盖资源归属问题,比如多个 Builder 共享同一 Product 导致意外修改,或者忘记 reset 引起悬挂指针。

  • Builder 的 getResult() 应该是 std::unique_ptr<productinterface>&&</productinterface>,强制转移语义
  • 如果 Product 必须被多个组件观察(比如日志、监控模块),由外部用 shared_ptr 包一层,Builder 不参与
  • 注意:不要在 Builder 里用 shared_ptr 存自己构建的 Product,否则 getResult() 返回时可能触发循环引用
事情说清了就结束。最常被忽略的是 Builder 生命周期和 Product 所有权的边界 —— 一旦模糊,调试时根本看不出是谁在改那个对象。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

458

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

84

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1091

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

565

2023.09.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

510

2025.06.09

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

17

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.5万人学习

C 教程
C 教程

共75课时 | 5.6万人学习

C++教程
C++教程

共115课时 | 22.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号