ファクトリ メソッド パターン: DI/IoC による依存関係管理の課題への対処
Dependency Injection (DI) と Inversion of Control (IoC) によって強化された Factory Method パターンは、オブジェクト作成のためのエレガントな抽象化を提供します。 ただし、ファクトリのコンストラクター内で多数の依存関係を管理すると、問題が発生する可能性があります。 この記事では、この共通の課題に対する解決策を検討します。
問題: 複雑すぎるファクトリ コンストラクター
多くの依存関係を必要とするコンストラクターを含む CarFactory
は、この問題の例です。 この設計は、作成ロジックをカプセル化し、依存関係の詳細から分離するというファクトリー メソッドの目標に矛盾します。 車種の種類が増えると、各依存関係を手動で挿入するのが難しくなります。
ソリューション: 洗練されたアプローチ
2 つの主要なアプローチにより、依存関係管理が向上します。
アプローチ 1: コンテナーのインジェクション
これにより、依存関係を動的に解決するサービス コンテナを挿入することにより、ファクトリ コンストラクターが簡素化されます。 これにより、ファクトリの直接の依存関係が軽減されます:
public class CarFactory { private readonly IContainer _container; public CarFactory(IContainer container) { _container = container; } public ICar CreateCar(Type type) { // Resolve dependencies via the container switch (type) { case Type a: return _container.Resolve<ICar1>(); case Type b: return _container.Resolve<ICar2>(); default: throw new ArgumentException("Unsupported car type."); } } }
このアプローチは効果的ではありますが、サービス ロケーターへの依存を導入します。
アプローチ 2: 戦略パターン – よりエレガントなソリューション
Strategy パターンは、ファクトリのインターフェイスをその実装から切り離すことにより、優れたソリューションを提供します。 これにより、複数のファクトリを登録し、オブジェクト タイプに基づいてそれらを動的に選択できるようになります:
インターフェース:
public interface ICarFactory { ICar CreateCar(); bool AppliesTo(Type type); } public interface ICarStrategy { ICar CreateCar(Type type); }
コンクリート工場 (例):
public class Car1Factory : ICarFactory { // Dependencies injected into the factory public Car1Factory(IDep1 dep1, IDep2 dep2, IDep3 dep3) { ... } public ICar CreateCar() { ... } public bool AppliesTo(Type type) { ... } } public class Car2Factory : ICarFactory { ... }
戦略:
public class CarStrategy : ICarStrategy { private readonly ICarFactory[] _carFactories; public CarStrategy(ICarFactory[] carFactories) { _carFactories = carFactories; } public ICar CreateCar(Type type) { var factory = _carFactories.FirstOrDefault(f => f.AppliesTo(type)); if (factory == null) throw new InvalidOperationException("No factory registered for type " + type); return factory.CreateCar(); } }
使用法:
var strategy = new CarStrategy(new ICarFactory[] { new Car1Factory(dep1, dep2, dep3), new Car2Factory(dep4, dep5, dep6) }); var car1 = strategy.CreateCar(typeof(Car1)); var car2 = strategy.CreateCar(typeof(Car2));
このアプローチは柔軟性と拡張性を提供し、新しいファクトリーの簡単な登録と合理化されたオブジェクト作成を可能にします。 作成ロジックを依存関係から効果的に分離し、複雑な関係の開発と維持を簡素化します。
以上がDI/IoC を使用してファクトリ メソッド パターンの依存関係を効果的に管理するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。