c++11 - 构建器模式 - Build() 方法的可重用性
问题描述
有一个建造者。编程语言无关紧要。
哪一个是正确的:
- 你设置了构建器
- 您可以
Build()
多次拨打电话。因此,您最终会得到具有相同参数的 X 个对象(如果添加更多配置,甚至会更改参数。
- 你设置了构建器
- 调用后
Build()
,必须再次设置构建器才能构建另一个对象。
是否有任何约定应该如何Build()
表现?
这两种情况都可能有效。在第一种情况下,您必须复制值,在第二种情况下,您可以将值从构建器移动到创建的对象。
我想正确命名“建设者”,以便能够通过阅读名称来区分行为;代码注释是谎言,代码总是说真话。
=== 编辑
C++11 的解决方案非常有趣:
class Builder final
{
public:
Result Build() &&;
Result Build() & const; //if you allow building multiple times
};
//... usage:
auto optimized = Builder().Build();
auto builder;
auto copy = builder.Build();
auto optimized2 = std::move(builder).Build();
使用变量 afterstd::move
主要被假定为无效操作(它处于有效但未确定的状态,直到您设置此变量的新状态,或者您在类型文档中说可以使用它)
解决方案
Josh Bloch 在Effective Java中描述了它的第一种方式。
Builder 模式非常灵活。可以重复使用单个构建器来构建多个对象。构建器的参数可以在方法调用之间进行调整,
build
以改变创建的对象。
推荐阅读
- pandas - 数据框 Sort_values 给出不正确的结果
- java - 将字符串转换为 java.util.TimeZone
- excel - 将自定义值重新格式化为文本(前导零)
- android - 颤振:输入“未来”
' 不是类型 'Widget' (flutter_tts) 的子类型 - awk - 如何在linux的开始和结束处删除2个或多个空格
- php - 模块 Prestashop 嫁接钩子模块是不同的服务器开发和预生产
- css - 如何根据内容设置 mat-drawer-container、mat-drawer 和 mat-drawer-content 高度响应?
- python - TweepError:最大重试次数超出 url:/1.1/statuses/update.json?status=(由 SSL 错误引起)
- wordpress - 手动将 wordpress 网站定制为双语
- sql - 我可以将 FOREIGN KEY 引用到 Postgresql v13 中的分区表吗?