この質問が古いことは承知していますが、5 セント追加したいと思います。
依存性注入 (DI) は多くの点で、構成可能なファクトリー パターン (FP) に似ていると思います。その意味で、DI でできることはすべて、そのようなファクトリーでもできるようになります。
実際、たとえばSpringを使用する場合、自動配線リソース(DI)または次のようなオプションがあります。
MyBean mb = ctx.getBean("myBean");
そして、その「mb」インスタンスを使用して何かを行います。インスタンスを返すファクトリの呼び出しではありませんか??
ほとんどの FP の例で気付いた唯一の実際の違いは、「myBean」が xml または別のクラスにあるものを構成でき、フレームワークがファクトリとして機能することですが、それ以外は同じことです。確かに、構成ファイルを読み取るか、必要に応じて実装を取得する Factory を持つことができます。
そして、私の意見を求められた場合 (そして、あなたがそうしなかったことは知っています)、DI は同じことを行うと思いますが、開発をより複雑にするだけです。なぜですか?
まず、DI で自動配線する Bean に使用されている実装を知るには、構成自体に移動する必要があります。
しかし...使用しているオブジェクトの実装を知る必要がないという約束はどうですか? ふふっ!真剣に?このようなアプローチを使用すると...実装を書くのと同じではありませんか?? そうでない場合でも、ほとんどの場合、実装が本来の目的をどのように実行するかを確認していませんか??
最後にもう 1 つ、DI フレームワークが、クラスに依存することなく、DI フレームワークから切り離されたものを構築することをどれだけ約束してもかまいません。フレームワークを使用している場合は、その周りにすべてを構築します。アプローチやフレームワークを変更するのは簡単なことではありません...決して!...しかし、ビジネスにとって何が最善の解決策であるかを心配するのではなく、その特定のフレームワークを中心にすべてを構築するため、それを行うときに大きな問題に直面することになります。
実際、私が見ることができる唯一の FP または DI アプローチの実際のビジネス アプリケーションは、実行時に使用されている実装を変更する必要がある場合ですが、少なくとも私が知っているフレームワークではそれを行うことができません。開発時の構成ではすべてが完璧であり、必要に応じて別のアプローチを使用します。
したがって、同じアプリケーション内の 2 つのスコープで異なるパフォーマンスを示すクラスがある場合 (たとえば、持ち株会社の 2 つの会社)、2 つの異なる Bean を作成するようにフレームワークを構成し、それぞれを使用するようにコードを調整する必要があります。次のように書くのと同じではないでしょうか。
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
これと同じ:
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
この:
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise1"); //In the classes of the first enterprise
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise2"); //In the classes of the second enterprise
いずれにせよ、クラスであれ構成ファイルであれ、アプリケーションで何かを変更する必要がありますが、それを再デプロイする必要があります。
次のようなことをするのはいいことではないでしょうか:
MyBean mb = (MyBean)MyFactory.get("mb");
そして、そのようにして、ログに記録されたユーザーエンタープライズに応じて、実行時に適切な実装を取得するようにファクトリのコードを設定しますか?? 今それは役に立ちます。新しいクラスを含む新しい jar を追加し、実行時にルールを設定することもできます (または、このオプションを開いたままにする場合は新しい構成ファイルを追加します)。既存のクラスを変更する必要はありません。これは動的工場になります。
これは、企業ごとに 2 つの構成を作成し、それぞれに 2 つの異なるアプリケーションを用意するよりも便利ではないでしょうか??
実行時に切り替えを行う必要がないので、アプリを構成し、クラスを継承するか別の実装を使用する場合は、構成を変更して再デプロイするだけです。わかりました、それは工場でも行うことができます。正直に言うと、これを何回やりますか?社内の別の場所で使用する予定のアプリがあり、そのコードを別のチームに渡し、彼らがこのようなことを行う場合にのみ使用できます。でもねえ、それはファクトリーでもできますし、動的ファクトリーならもっといいでしょう!!
とにかく、あなたが私を殺すために開いているなら、コメントセクション。