検索
ホームページバックエンド開発C++依存関係の注入と戦略パターンを使用して、ファクトリ メソッドを過剰な依存関係から切り離す方法

How to Decouple Factory Methods from Excessive Dependencies using Dependency Injection and the Strategy Pattern?

依存関係の注入と制御の反転を使用して、ファクトリ メソッドの過剰な依存関係を管理します

ソフトウェア アーキテクチャにファクトリー メソッド パターンを統合することは一般的な手法ですが、多数の依存関係を扱う場合は困難になる可能性があります。この記事では、依存性注入 (DI) と制御の反転 (IoC) の原則を遵守しながら、この制限を克服する代替案を検討します。

伝統的な工場手法の問題点

従来のファクトリー メソッドの実装では、通常、switch-case ステートメントを使用してさまざまなタイプの自動車を処理し、それぞれに独自の依存関係のセットが必要です。このアプローチは、重複が発生し、新しい車種の追加がより困難になるため、多数の車種を扱う場合には扱いにくく、維持が困難になる可能性があります。

戦略モードと独立した工場

より効率的な解決策は、スタンドアロン ファクトリで Strategy パターンを使用することです。 switch-case ロジックをストラテジー オブジェクトに置き換えることで、ファクトリの作成と依存関係の注入の問題を切り離すことができます。これにより、各工場が特定のタイプの自動車の作成を担当し、そのタイプに必要な依存関係のみを含めることができます。

戦略オブジェクトはコーディネーターとして機能し、車種に基づいてどのファクトリーを使用するかを決定します。 DI を使用することで、戦略オブジェクトは必要なすべてのファクトリーを注入できるため、特定の自動車ファクトリーに直接依存せずに、あらゆるタイプの自動車を作成できるようになります。

実装例

このアプローチの実装例を次に示します:

<code>// 定义工厂和策略组件的接口
public interface ICarFactory
{
    ICar CreateCar();
    bool AppliesTo(Type type);
}

public interface ICarStrategy
{
    ICar CreateCar(Type type);
}

// 为每种类型的汽车实现工厂
public class Car1Factory : ICarFactory
{
    private readonly IDep1 dep1;
    private readonly IDep2 dep2;
    private readonly IDep3 dep3;

    // 将依赖项注入工厂构造函数
    public Car1Factory(IDep1 dep1, IDep2 dep2, IDep3 dep3)
    {
        ...
    }

    public ICar CreateCar()
    {
        return new Car1(dep1, dep2, dep3);
    }

    public bool AppliesTo(Type type)
    {
        return typeof(Car1).Equals(type);
    }
}

// 实现策略类
public class CarStrategy : ICarStrategy
{
    private readonly ICarFactory[] carFactories;

    // 将所有可用的工厂注入策略构造函数
    public CarStrategy(ICarFactory[] carFactories)
    {
        this.carFactories = carFactories;
    }

    public ICar CreateCar(Type type)
    {
        var factory = carFactories.FirstOrDefault(f => f.AppliesTo(type));
        if (factory == null)
            throw new InvalidOperationException("未找到指定类型的工厂");

        return factory.CreateCar();
    }
}

// 用法:创建策略对象并使用它来创建不同类型的汽车
var strategy = new CarStrategy(new ICarFactory[] 
{
    new Car1Factory(...),
    new Car2Factory(...)
});

var car1 = strategy.CreateCar(typeof(Car1));
var car2 = strategy.CreateCar(typeof(Car2));</code>

メリット

この方法には次の利点があります:

  • 重複の削減: switch-case ステートメントやファクトリ間の依存関係の重複は必要ありません。
  • 柔軟性: 新しい工場をポリシーに登録することで、新しい車種を簡単に追加できます。
  • テスト可能性: 個別のファクトリーにより、すべての依存関係のモック コンテキストを作成することなく単体テストが可能になります。
  • 懸念事項の分離: ファクトリの作成を依存関係の注入から切り離し、コードの保守性を向上させます。

戦略パターンと DI を活用することで、依存関係の注入と制御の反転の原則を守りながら、ファクトリ メソッドでの過剰な依存関係を管理するための簡潔でスケーラブルなソリューションを実装しました。

以上が依存関係の注入と戦略パターンを使用して、ファクトリ メソッドを過剰な依存関係から切り離す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
GULC:Cライブラリはゼロから構築されていますGULC:Cライブラリはゼロから構築されていますMar 03, 2025 pm 05:46 PM

GULCは、最小限のオーバーヘッド、積極的なインライン、およびコンパイラの最適化を優先する高性能Cライブラリです。 高周波取引や組み込みシステムなどのパフォーマンスクリティカルなアプリケーションに最適な設計では、シンプルさ、モジュールが強調されています

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか?C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか?Mar 03, 2025 pm 05:52 PM

この記事では、c関数のリターンタイプ、基本(int、float、charなど)、派生(配列、ポインター、構造体)、およびvoid型を含む詳細を示します。 コンパイラは、関数宣言とreturnステートメントを介して返品タイプを決定し、強制します

C言語関数の定義と呼び出しルールは何ですか、そしてC言語関数の定義と呼び出しルールは何ですか、そしてMar 03, 2025 pm 05:53 PM

この記事では、C関数宣言と定義、引数の合格(価値とポインターによる)、返品値、およびメモリリークやタイプの不一致などの一般的な落とし穴について説明します。 モジュール性とProviの宣言の重要性を強調しています

c言語関数形式文字ケース変換手順c言語関数形式文字ケース変換手順Mar 03, 2025 pm 05:53 PM

この記事では、文字列ケース変換のC関数について詳しく説明しています。 ctype.hのtoupper()とtolower()を使用し、文字列を介して繰り返し、ヌルターミネーターを処理することを説明しています。 ctype.hを忘れたり、文字列リテラルを変更するなどの一般的な落とし穴は

メモリに保存されているC言語関数の返品値はどこにありますか?メモリに保存されているC言語関数の返品値はどこにありますか?Mar 03, 2025 pm 05:51 PM

この記事では、C関数の戻り値ストレージを調べます。 通常、リターン値は通常、速度のためにレジスタに保存されます。値が大きいと、ポインターをメモリ(スタックまたはヒープ)に使用し、寿命に影響を与え、手動のメモリ管理が必要になります。直接acc

明確な使用法とフレーズ共有明確な使用法とフレーズ共有Mar 03, 2025 pm 05:51 PM

この記事では、形容詞の「個別」の多面的な使用法を分析し、その文法機能、一般的なフレーズ(例:「はっきりと異なる」とは異なる」、およびフォーマルと非公式の微妙なアプリケーションを調査します。

C標準テンプレートライブラリ(STL)はどのように機能しますか?C標準テンプレートライブラリ(STL)はどのように機能しますか?Mar 12, 2025 pm 04:50 PM

この記事では、C標準テンプレートライブラリ(STL)について説明し、そのコアコンポーネント(コンテナ、イテレーター、アルゴリズム、およびファンクター)に焦点を当てています。 これらが一般的なプログラミングを有効にし、コード効率を向上させ、読みやすさを改善する方法を詳述しています。

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか?STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか?Mar 12, 2025 pm 04:52 PM

この記事では、cの効率的なSTLアルゴリズムの使用について詳しく説明しています。 データ構造の選択(ベクトル対リスト)、アルゴリズムの複雑さ分析(STD :: STD :: STD :: PARTIAL_SORTなど)、イテレーターの使用、および並列実行を強調しています。 のような一般的な落とし穴

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい