2011-12-21 79 views
1

我有3類:這是一個模式,或者類似的模式,什麼是它的名字

  • 的接口類,它定義了一些方法
  • 2類,其實現該接口Class_AClass_B

我然後具有基本上選擇某種條件

class Chooser 
{ 
    public static function choose($condition) 
    { 
     $class = 'Class_' . ucfirst($condition); 
     return new $class(); 
    } 
} 
012類(A或者B)來實例化的基於類

然後我調用靜態選擇方法,它返回正確的類的實例(A或B)

Chooser::choose($condition); 

我的問題:

  • 首先,這是一個有效的模式(或接近一個模式),它是什麼名字
  • 如果它接近一個模式,我該如何修改,所以它是一個合適的模式
  • 第三,選擇類是如此簡單。我可以在原始代碼中使用該邏輯,而不是Chooser::choose($condition);。如果我這樣做,現在是否會混淆模式?

回答

2

我不會把它稱爲模式,因爲它是具體的代碼。模式只是對可以做什麼的描述。它看起來有點像工廠模式的實現,如果你把它稱爲Factory,大多數用戶可能會更快地理解它的用途。

但是它可能更好地描述爲參數化對象的創建,因爲你不驗證它生成的類實現一個特定的接口,這是一種常見的工廠模式的一部分。

確保函數返回具有特定接口的類型。

class Chooser 
{ 
    /** 
    * @return interface 
    */ 
    public static function choose($condition) 
    { 
     $class = 'Class_' . ucfirst($condition); 
     if (!is_a($class, 'interface')) 
      return NULL; 
     return new $class(); 
    } 
} 

這需要一些特定的PHP版本,可以通過由於is_a在PHP漏洞的影響。還有其他的方法來檢查一個特定的類名是否實現了一個接口。我把這留作練習。

如果條件不導致對象或者它應該拋出異常,您還需要決定chooser()函數是否返回NULL

+0

謝謝你。擴大的答案真的幫助:) – sameold

+0

不客氣。通常有不止一個問題的答案,所以請記住其他答案(也接受和/或upvote)。 – hakre

3

是的,你的例子符合工廠模式。這是創作模式之一。

在您的原始代碼中,根據您的界面進行所有編碼。選擇器將負責對實例化的類進行正確的選擇。通過這樣做你可以實現高度的關注分離。 在這裏閱讀更多關於它的信息。 http://www.oodesign.com/factory-pattern.html

+0

在給出的代碼中沒有檢查接口。那麼它是否會喪失工廠模式的資格? – hakre

+0

Factory的基本目標是封裝新對象的創建。這似乎就是這種情況,即使沒有界面。 – Wivani

+0

@Anand謝謝你的回答。選擇正確的答案很困難。因爲「is_a」的觀點,我很喜歡。 – sameold

相關問題