2011-11-28 36 views
3

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

我问这是因为我使用的PHP其中对象默认是通过引用传递的(nope,我不想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; 
} 

回答

3

复位状态getProcessor()是不明显的,如果你想做到这一点的方法应该反映它的名字,例如getProcessorAndReset()。一个更清洁的解决方案将是给建设者一个单独的reset()方法。

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