0

我想檢查一下我是否理解使用和實現工廠模式。假設我正在設計一個應用程序來玩幾個遊戲(象棋,撲克)。 遊戲從以下來源之一加載:CSV,XML 但我希望能夠添加新的來源(比方說數據庫),而無需重新編譯/重新部署應用程序。我只想部署工廠邏輯和新的加載程序OOD - 如何設計和構建項目以避免重新部署主應用程序(工廠模式?)

這暗示了遊戲加載器的工廠模式,類似於以下內容,但這會導致循環依賴,因爲混凝土加載器會返回List。

Application.prj has reference to AbstractFactory.prj 
----------------------- 

    main() 
    List<Game> games = LoadGameFactory.Create(src).Load(src) 
    foreach(game in games) game.play(); 

abstract class Game { .. abstract void Play(); ..} 
class Chess : Game { .. void Play() ..} 
class Poker : Game { .. void Play() ..} 

Factory.prj has reference to Application.prj 
------------------------ 
class LoadGameFactory { 
    GameLoader Create(string src) 
    { 
     if(src == csv) return new LoadCSVGames().Load(src) 
     else   return new LoadXMLGames().Load(src)  
    } 
} 
class GameLoader{ List<Game> Load(src) } 

class CSVLoader : GameLoader 
{ 
    List<Game> Load(src){ ... logic to create Chess() and Poker() from CSV file} 
} 

class XMLLoader : GameLoader 
{ 
    List<Game> Load(src) { ... logic to create Chess() and Poker() from XML file} 
} 

我找到的解決方案是創建一個新的項目,Application.Model,在那裏我移動遊戲,國際象棋,撲克和,ECC 這樣,Application.prj和Factory.prj需要只是參考Application.Model。添加數據庫源只需要factory.prj重新編譯和部署。

這是要走的路嗎?或者是否有辦法實現工廠模式以獲得相同的結果。我不想反思。

回答

0

這聽起來像你想要一個基於插件的設計。我假設這是C#。你想要做的是設計一組嚴格的界面,定義遊戲,遊戲加載器等。然後你使用Assembly.LoadFrom()來加載所有的DLL,並使用反射從這些組件中獲得從那些接口繼承的導出類,並實例化新的對象。

+0

好吧,我知道用反射可以做到這一點,但我的尷尬更多的是如何實現工廠模式,以避免構建主應用程序。 – aljj 2012-07-22 21:08:19

+0

我不確定這意味着什麼。我想你在這裏混合了幾個不同的東西。工廠模式幾乎意味着沒有類的公共構造函數,相反,您必須調用靜態「工廠方法」來獲取實例。通常情況下,因爲工廠方法做了一些稍微複雜的事情來獲得這個實例。 (例如,它實際上可能會從你期待的返回一些派生類型。) – 2012-07-22 22:26:16

+0

好吧,我同意工廠模式是什麼。然而,構建它是一個合理的要求,以便我們可以向工廠方法添加新的具體類和實例邏輯,而不會重複編譯工廠消費者。特別是如果你有一個大消費者需要花費數小時的時間來編譯和部署數小時。我找到了一種方法來解決這個問題,我問是否有更好的方法(沒有反思) – aljj 2012-07-23 20:31:16