ホームページ > バックエンド開発 > C++ > 依存関係の注入は、多くの依存関係を持つファクトリ メソッドの課題をどのように解決できるのでしょうか?

依存関係の注入は、多くの依存関係を持つファクトリ メソッドの課題をどのように解決できるのでしょうか?

Linda Hamilton
リリース: 2025-01-21 01:16:11
オリジナル
325 人が閲覧しました

How Can Dependency Injection Solve Factory Method Challenges with Many Dependencies?

依存関係の注入と制御の反転を使用したファクトリ メソッド

質問:

あなたはファクトリ メソッド パターンには精通していますが、ファクトリ コンストラクターで多数の依存関係を管理するという課題に直面しています。具体的な自動車クラスをファクトリに注入しようとしましたが、これはファクトリの原則に違反します。また、サービス ロケーターはアンチパターンであることが知られているため、使用したくないでしょう。

解決策:

このシナリオに最も適した方法は、戦略モードです。このパターンを使用すると、DI コンテナーがそれに属するファクトリ インスタンスに依存関係を注入できるため、サービス ロケーターを使用したり、他のクラスを依存関係で混乱させたりする必要がなくなります。

実装:

インターフェース:

<code>public interface ICarFactory
{
    ICar CreateCar();
    bool AppliesTo(Type type);
}

public interface ICarStrategy
{
    ICar CreateCar(Type type);
}</code>
ログイン後にコピー

工場:

<code>public class Car1Factory : ICarFactory
{
    private readonly IDep1 dep1;
    private readonly IDep2 dep2;
    private readonly IDep3 dep3;

    // ... 构造函数和实现
}

public class Car2Factory : ICarFactory
{
    private readonly IDep4 dep4;
    private readonly IDep5 dep5;
    private readonly IDep6 dep6;

    // ... 构造函数和实现
}</code>
ログイン後にコピー

戦略:

<code>public class CarStrategy : ICarStrategy
{
    private readonly ICarFactory[] carFactories;

    public CarStrategy(ICarFactory[] carFactories)
    {
        // ... 构造函数和实现
    }
}</code>
ログイン後にコピー

使用法:

<code>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));</code>
ログイン後にコピー

利点:

  • ファクトリでは switch case ステートメントの使用を避けてください。
  • 再設計せずに工場の追加をサポートします。
  • 各ファクトリーには、DI コンテナーによって注入された独自の依存関係があります。
  • 依存関係の注入と制御の反転の原則に従います。

以上が依存関係の注入は、多くの依存関係を持つファクトリ メソッドの課題をどのように解決できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート