0

我想检查一下我对使用和实现工厂模式的理解。假设我正在设计一个应用程序来玩几个游戏(国际象棋、扑克)。游戏是从以下来源之一加载的:CSV、XML,但我希望能够在不重新编译/重新部署应用程序的情况下添加新来源(比如 DB)。我只想部署工厂逻辑和新加载器

这暗示了游戏加载器的工厂模式,类似于以下内容,但由于具体加载器返回一个列表,因此会导致循环依赖。

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,在其中移动 Game、Chess 和 Poker,ecc 这样,Application.prj 和 Factory.prj 将只需要引用 Application.Model。并且添加数据库源只需要 factory.prj 重新编译和部署。

这是要走的路吗?或者有没有办法实现工厂模式以获得相同的结果。我不想反思。

4

1 回答 1

0

听起来你想要一个基于插件的设计。我假设这是 C#。你要做的是设计一组严格的接口,定义游戏、游戏加载器等。然后你Assembly.LoadFrom()用来加载所有的 DLL,并使用反射来获取从这些接口继承的导出类,从那些程序集,并实例化新对象。

于 2012-07-22T20:07:46.917 回答