web-dev-qa-db-ja.com

使用法-ファクトリパターンと依存性注入

さて、この質問はどちらが良いかではありません。 Dependency InjectionとFactoryをいつ使用するかについての詳細です。

私は少し研究をしました、そしてそれはこのようになります。

浸漬:

  • IoCを通じて疎結合を提供します。クラスは、依存関係をどのように取得したかを知る必要はありません。 IoCコンテナーは、依存関係の提供を制御します。

工場:

  • これは、クラスの依存関係を生成するために使用される作成パターンです。また、クラスは依存関係を直接作成しなくなったため、疎結合も提供します。

私にとっては、ほとんどの状況で依存関係を注入するためにDIを使用でき、ファクトリーは完全に省略できるようです。私はSpringを使用しており(現在は1年)、ほとんどの場合、クラスには1つまたは2つの特定の依存関係が必要であり、Springを使用すると非常に簡単です。

ファクトリーについて、DIが少し面倒であると私が思う1つのシナリオは、クラスがある条件に基づいて特定の依存関係を必要とするときです。

このようなもの:

class Bike {
private Engine engine;
private Model model;

public initEngine() {
  if(model == 'VINTAGE')
    engine = new CaseIronEngine();

  else if(model == 'MODERN')
    engine = new AluminiumAlloyEngine();

 ..
 ..
}
}

この場合、DIはそれほど単純ではなく、ファクトリーは理想的なソリューションであるはずです。

とても親切にこれについていくつかの考えを投げかけました。 Web上の多くの記事では、DIはファクトリーパターンの代わりの一種であると述べています。しかし、それでも、どの状況下でどちらがより良い選択になるかについての具体的な記事はありません。

次のようにDIを次の大きなものとして言及するいくつかの記事は次のとおりです。

5
AgentX

あなたはほとんど頭の上の釘を打ちました。

依存関係の注入は、構成方法に応じて、実行時またはコンパイル時に既知で変化しない依存関係を取得する場合に最適です。 IMailerによって実装されたアプリケーションにメーラーがあり、TextBasedMailerまたはHtmlBasedMailerを使用できると仮定しましょう。アプリケーションをビルドするか、構成ファイルを使用して、使用する実装をDIフレームワークに指示します。

ここで、使用するIMailerがユーザーの設定に依存するとします。一部のユーザーはプレーンテキストの電子メール、その他のHTMLを望んでいます。 IMailerインスタンスを要求するとき、解決するメーラーを決定するための何らかのロジックが必要です。このロジックはおそらくクラスで分離され、その時点では、たとえそれを呼び出さなくても、ほとんどFactoryパターンを使用しています。

これら2つは相互に排他的ではないことに注意してください。たとえば、アプリケーションが添付ファイルをユーザーが選択した形式でメール送信できるとします。 PdfAttachmentGenerator、HtmlAttachmentGenerator、WordAttachmentGeneratorなど、さまざまなIAttachmentGeneratorを実装します。DIを介してIAttachmentGeneratorのリストを取得し、ユーザー設定に基づいて使用する正しいジェネレータを解決するAttachmentFactoryを作成できます。この場合、DIとファクトリを使用しています。

6
JDT