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