この質問が古いことは知っていますが、5セント追加したいと思います。
依存性注入(DI)は、構成可能なファクトリパターン(FP)のような多くの点で、その意味で、DIで実行できることなら何でも、そのようなファクトリで実行できると思います。
実際、たとえばSpringを使用している場合は、リソース(DI)を自動配線するか、次のようなオプションを選択できます。
MyBean mb = ctx.getBean("myBean");
そして、その「mb」インスタンスを使用して何でも行います。インスタンスを返すファクトリへの呼び出しではないですか?
ほとんどのFPの例の間で私が気づく唯一の本当の違いは、「myBean」がxmlまたは別のクラスにあるように構成でき、フレームワークがファクトリーとして機能することですが、それ以外は同じことです。確かに、必要に応じて、構成ファイルを読み取るか、実装を取得するファクトリーを持つことができます。
そして、あなたが私の意見を求めたら(そして私はあなたがそうしなかったことを知っています)、DIは同じことをするが、開発をより複雑にするだけだと思います。
1つには、DIで自動配線するBeanで使用されている実装を知るには、構成自体に移動する必要があります。
しかし...あなたが使用しているオブジェクトの実装を知る必要がないという約束はどうですか?PFFT!真剣に?このようなアプローチを使用すると...実装を書くのと同じではありませんか?そうでない場合でも、ほとんどの場合、実装が想定されていることを実装がどのように実行するかを確認する必要はありませんか?
最後に、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つの異なるアプリケーションを作成するよりも役立つでしょうか?
言うまでもなく、実行時に切り替えを行う必要はないので、アプリを構成します。クラスを継承する場合や別の実装を使用する場合は、構成を変更して再デプロイするだけです。わかりました、それはまた、工場で行うことができます。そして正直に言うと、何回これをしますか?おそらく、社内の他の場所で使用される予定のアプリがあり、コードを別のチームに渡そうとすると、彼らはこのようなことを行います。でもねえ、それはファクトリーでもできますし、ダイナミックなファクトリーならもっと良いでしょう!!
とにかく、コメント欄は私を殺すために開いているなら。