有一个建造者。编程语言无关。
哪个是正确的:
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();
在std::move
之后使用变量主要被认为是无效操作(它处于有效状态,但是直到您设置了该变量的新状态,或者您在类型文档中说可以使用它时才确定)。 / p>
答案 0 :(得分:0)
Josh Bloch用有效的Java 的第一种方式描述了它。
Builder模式非常灵活。单个构建器可以重复用于构建多个对象。可以在
build
方法的调用之间调整构建器的参数,以更改所创建的对象。
答案 1 :(得分:0)
两种方法都有效,但有一些警告。这真的取决于您的目的。对于外部代码,build
方法仅返回Builder负责创建的类型的对象。但是,在内部,您可以在Builder的构造函数中创建该对象(当您需要Builder的不同实例时),也可以直接在build
方法内部创建对象(我已经看过很多静态Builders像这样)。
通过第一个选项,build()
始终返回对同一对象的引用。在第二个阶段中,每次调用build()
都会得到一个全新的对象。
但是,请注意,该模式具有足够的灵活性来执行其他操作-在Builder实例的每个build
调用上创建一个新对象,并在静态Builder上重用相同的(静态)对象
就像我在一开始所说的那样,两种形式都有效。这确实取决于您的领域和目的。