建造者模式 - Build() 方法的可重用性

Builder pattern - Build() method reusability

有一个生成器。编程语言无关。

正确的是:

    • 您设置了生成器
    • 您可以多次拨打 Build()。所以结果你最终得到 X 个具有相同参数的对象(或者如果你添加更多配置甚至改变参数。
    • 您设置了构建器
    • Build() 调用后,必须重新设置构建器才能构建另一个对象。

是否有任何约定 Build() 应该如何表现?

这两种情况都可能有效。在第一种情况下,您必须复制值,在第二种情况下,您可以将值从构建器移动到创建的对象。

我想给 "builders" 正确命名,以便能够通过阅读名称来区分行为;代码注释都是谎言,代码总是说实话。

===编辑

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();

std::move之后使用变量主要被假定为无效操作(它处于有效但未确定的状态,直到您设置此变量的新状态,或者您在类型文档中说可以使用它)

Josh Bloch 在 Effective Java.

中描述了第一种方式

The Builder pattern is quite flexible. A single builder can be used repeatedly to build multiple objects. The parameters of the builder can be tweaked between invocations of the build method to vary the objects that are created.

两种方式都有效,但有一些注意事项。这真的取决于你的目的。对于外部代码,build 方法只是 returns Builder 负责创建的类型的对象。但是,在内部您可以在 Builder 的构造函数中创建该对象(当您想要 Builder 的不同实例时),或者您可以直接在 build 方法中创建对象(我见过很多静态 Builders像这样)。

通过第一个选项,build()总是returns对同一个对象的引用。通过第二个,你每次调用build()都会得到一个全新的对象。

但是请注意,该模式足够灵活,可以以相反的方式做事 - 在每次 build 调用 Builder 实例时创建一个新对象,并在静态生成器。

就像我一开始说的,两种形式都有效。这实际上取决于您的领域和目的。