2011-03-22 50 views
0

我第一次嘗試使用工廠方法。似乎有兩種方法可以做到這一點,我不確定何時使用哪種方法(或者如果其中一種方法錯誤?)。工廠模式問題

1)創建具有由子類覆蓋的方法的抽象類:

public abstract class EmployeeCreator 
{ 
    public abstract Employee FactoryMethod(); 
} 

public class DeveloperCreator : EmployeeCreator 
{ 
    public override Employee FactoryMethod() 
    { 
     return new Developer(); 
    } 
} 

2)在它創建具有一個工廠方法的類:

public class EmployeeFactory 
{ 
    public static Employee CreateEmployee(EmployeeType type) 
    { 
     if (type == EmployeeType.Developer) 
      return new Developer(); 
     else 
      return new Secretary(); 
    } 
} 

好像在我的案例#2將會變得更容易,因爲我不需要創建所有這些「創建者」子類,除了返回正確類型的員工之外,這些子類實際上並沒有多大作用。

但它仍在使用工廠模式?

回答

4

你的第一個案例是Abstract Factory模式,而第二個案例是Factory Method。這是兩種不同的模式,都是有效的和有用的。 (實際上沒有「工廠模式」 - 只要你聽到這個術語,它就是對上述模式之一的引用)。

如果你只有一個產品創建,工廠方法通常是一個更好的選擇。如果您有任何可能需要創建相關產品系列,您需要抽象工廠。如果您需要將工廠注入代碼中的不同位置,後者也更好,因爲爲此目的有更好的界面。

+0

100%同意,對於你的情況,你應該去案例二。 – 2011-03-22 16:01:40

+0

根據Head First Design Patterns書籍,第一個不是第一個簡單工廠的例子,第二個是工廠?抽象工廠是針對產品系列的,不是? – Joe 2011-03-24 12:55:37

+0

@Joe,在你的第一個例子中,這個家庭只有一個成員,就是這樣。恕我直言,這不值得一個單獨的名稱。你仍然有抽象的基類/接口和單獨的具體工廠子類,這就是模式的主要觀點。 – 2011-03-24 13:37:56

0

我真的不確定哪種方式「正確」,但我可以告訴您,您的第二種選擇將在您的方案中更有用,正如您所說的。我嘗試在抽象基類中使用靜態創建方法,以便根據必要的邏輯實例化正確的子類。這聽起來就是你正在試圖做的事情,我也沒有看到任何問題。

請記住,設計模式是解決問題和幫助通過標準化維護的指導。如果你發現某些保持相同「精神」的東西,但爲了某種明顯的原因更適合你的需要,我沒有理由不去追求它。

+0

謝謝。你說你在抽象基類(在我的例子Employee)中創建你的工廠方法?我想我也會這樣做,因爲只有一種工廠方法的課程似乎毫無意義。你通常把你的方法稱爲什麼,例如EmployeeFactory,CreateEmployee,GetEmployee ...? – Joe 2011-03-22 16:17:08

+0

@Joe通常就像CreateEmployee一樣,但使用符合您的代碼標準和約定的任何東西。 – Andrew 2011-03-22 16:28:13