构建器模式-Build()方法行为

时间:2018-11-29 13:25:54

标签: c++11 design-patterns builder-pattern

有一个建造者。编程语言无关。

哪个是正确的:

    • 您设置了构建器
    • 您可以多次拨打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>

2 个答案:

答案 0 :(得分:0)

Josh Bloch用有效的Java 的第一种方式描述了它。

  

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

答案 1 :(得分:0)

两种方法都有效,但有一些警告。这真的取决于您的目的。对于外部代码,build方法仅返回Builder负责创建的类型的对象。但是,在内部,您可以在Builder的构造函数中创建该对象(当您需要Builder的不同实例时),也可以直接在build方法内部创建对象(我已经看过很多静态Builders像这样)。

通过第一个选项,build()始终返回对同一对象的引用。在第二个阶段中,每次调用build()都会得到一个全新的对象。

但是,请注意,该模式具有足够的灵活性来执行其他操作-在Builder实例的每个build调用上创建一个新对象,并在静态Builder上重用相同的(静态)对象

就像我在一开始所说的那样,两种形式都有效。这确实取决于您的领域和目的。