2011-11-04 90 views
0

我問過一個問題:「這是正確的工廠方法模式嗎?」 Is this correct factory method pattern?如何將此簡單工廠轉換爲工廠方法?

and..then ...根據評論者的建議在codereview.stackexchange.com上提出同樣的問題。 https://codereview.stackexchange.com/questions/5752/is-this-correct-factory-method-pattern

所以......三個人說..我的代碼是一個工廠方法,但一個用戶指出我的代碼實際上是一個簡單的工廠。

隨着我一直在網上閱讀其他例子,我開始認爲我的代碼實際上是一個簡單的工廠。

我的代碼:

https://codereview.stackexchange.com/questions/5752/is-this-correct-factory-method-pattern

如何將我的代碼放到一個工廠方法模式?

回答

1

你實際上在你的例子中使用了一個簡單的工廠,它對我來說看起來很好。有了這些要求,就不需要去工廠方法模式。

但是我會嘗試在這種情況下解釋工廠方法。顧名思義:

工廠方法模式定義了一個創建對象的接口,但讓子類決定實例化哪個類。工廠方法允許類將實例化延遲到 子類。

所以基本上你會有一個抽象工廠類,它定義了哪些創建方法在混凝土工廠中可用,後者將決定創建哪些具體對象。

我可以在你的scenerio中想到一個例子。可以說你有不同品牌的Drivables(比如寶馬和本田)。所以你會有類似BMWCoupeDrivable, BMWMotorcycleDrivable, BMWSedanDrivable, HondaCoupeDrivable, HondaMotorcycleDrivable, HondaSedanDrivable的課程。將來你可能還會添加更多的品牌。在這種情況下,您可能使用工廠方法更好地使用 。

abstract class DriveableFactory 
    { 
     abstract public function create($numberOfPeople); 

     //-- Other methods here which manipulate the drivable 
     //-- e.g. testDrive() 
    } 

    class BMWDriveableFactory extends DriveableFactory 
    { 
     public function create($numberOfPeople){ 

      if($numberOfPeople == 1) 
      { 
       return new BMWMotorcycleDriveable; 
      }  
      elseif($numberOfPeople == 2) 
      { 
       return new BMWCoupleDriveable; 
      } 
      elseif($numberOfPeople >= 3 && $numberOfPeople < 4) 
      { 
       return BMWSedanDriveable; 
      } 
     } 
    } 

    class HondaDriveableFactory extends DriveableFactory 
    { 
     public function create($numberOfPeople){ 

      if($numberOfPeople == 1) 
      { 
       return new HondaMotorcycleDriveable; 
      }  
      elseif($numberOfPeople == 2) 
      { 
       return new HondaCoupleDriveable; 
      } 
      elseif($numberOfPeople >= 3 && $numberOfPeople < 4) 
      { 
       return HondaSedanDriveable; 
      } 
     } 
    } 

爲了更好的解釋,我建議您閱讀Head First Design Pattern。