如果构建器在交付产品后重置其构建环境

时间:2011-11-28 07:19:06

标签: language-agnostic builder design-patterns

我正在实施一个构建器,通过调用Builder::getProduct()来检索可交付成果。导演要求各个部分构建Builder::buildPartA()Builder::buildPartB()等,以便完全构建产品 我的问题是,一旦产品由构建器通过调用Builder::getProduct()提供,它是否应该重置其环境(Builder::partA = NULL;Builder::partB = NULL;)以便它可以构建另一个产品? (具有相同或不同的配置?)

我问这个,因为我正在使用PHP,其中默认情况下通过引用传递对象(不,我不想clone,因为其中一个字段是Resource)。但是,即使您从语言不可知的角度考虑,Builder是否应该重置其构建环境?如果您的回答是“这取决于具体情况”,哪些用例可以证明重置环境(以及其他方式)?

为了提供代码示例,我的Builder::gerProcessor()显示了重置环境

的含义
/**
 * @see IBuilder::getProessor()
 */
public function getProcessor()
{
    if($this->_processor == NULL) {
        throw new LogicException('Processor not yet built!');
    } else {
        $retval = $this->_processor;
        $this->_product = NULL, $this->_processor = NULL;
    }
    return $retval;
}

1 个答案:

答案 0 :(得分:3)

重置getProcessor()中的状态是不明显的,如果你想这样做,该方法应该反映出它的名称,例如getProcessorAndReset()。更简洁的解决方案是给构建器一个单独的reset()方法。

通常,您的getProcessor()不应该重置它的内部状态,因为方法不应该神奇地改变行为,但可靠地做同样的事情。 getProcessor()是一个查询,该查询应在每次调用时返回相同的已配置处理器。它不应该改变状态。重置状态是一个命令。你想要separate command and query methods