OOD - Как разработать и структурировать проекты, чтобы избежать повторного развертывания основного Приложения (шаблон фабрики?)
Я хотел бы проверить, насколько мое понимание в использовании и реализации фабричного шаблона. Скажем, я разрабатываю приложение для игры в несколько игр (шахматы, покер). Игры загружаются из одного из следующих источников: CSV, XML, но я хочу иметь возможность добавлять новые источники (например, БД) без перекомпиляции / повторного развертывания приложения. Я просто хочу развернуть заводскую логику и новый загрузчик
Это предполагает фабричный шаблон для загрузчика игры, что-то вроде следующего, которое, однако, вызывает циклические зависимости, потому что конкретные загрузчики возвращают 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, в который я перенесу Game, Chess и Poker, ecc. Таким образом, Application.prj и Factory.prj должны будут ссылаться только на Application.Model. А добавление источника БД требует только factory.prj перекомпиляции и развертывания.
Это путь? или есть способ реализовать фабричный шаблон, чтобы получить тот же результат. Я не хочу отражения.
1 ответ
Похоже, вы хотите дизайн на основе плагинов. Я предполагаю, что это C#. То, что вы хотите сделать, это разработать строгий набор интерфейсов, которые определяют игры, загрузчик игр и т. Д. Затем вы используете Assembly.LoadFrom()
загрузить все библиотеки DLL и использовать отражение, чтобы получить экспортированные классы, которые наследуются от этих интерфейсов, от этих сборок, и создать новые объекты.