2011-11-28 38 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