我正在实施一个构建器,通过调用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;
}
答案 0 :(得分:3)
重置getProcessor()
中的状态是不明显的,如果你想这样做,该方法应该反映出它的名称,例如getProcessorAndReset()
。更简洁的解决方案是给构建器一个单独的reset()
方法。
通常,您的getProcessor()
不应该重置它的内部状态,因为方法不应该神奇地改变行为,但可靠地做同样的事情。 getProcessor()
是一个查询,该查询应在每次调用时返回相同的已配置处理器。它不应该改变状态。重置状态是一个命令。你想要separate command and query methods。