首页 > 解决方案 > 构建器模式 - 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主要被假定为无效操作(它处于有效但未确定的状态,直到您设置此变量的新状态,或者您在类型文档中说可以使用它)

标签: c++11design-patternsbuilderbuilder-pattern

解决方案


Josh Bloch 在Effective Java中描述了它的第一种方式。

Builder 模式非常灵活。可以重复使用单个构建器来构建多个对象。构建器的参数可以在方法调用之间进行调整,build以改变创建的对象。


推荐阅读