ファクトリパターンの使用と実装に関する私の理解を確認したいと思います。いくつかのゲーム (チェス、ポーカー) をプレイするアプリケーションを設計しているとします。ゲームは、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 を作成することです。ecc そうすれば、Application.prj と Factory.prj は Application.Model だけを参照する必要があります。また、DB ソースを追加するには、factory.prj の再コンパイルとデプロイのみが必要です。
これは行く方法ですか?または、ファクトリ パターンを実装して同じ結果を得る方法はありますか。反省したくない。