一見すると、ServiceLocatorパターンはAbstractFactoryパターンと同じように見えます。どちらも同じように使用されているようで(抽象サービスのインスタンスを受け取るようにクエリを実行します)、依存性注入について読んだときに両方とも言及されています。
ただし、 Service Locatorパターンが不適切なアイデアとして説明されているのを見ました 、しかし 少なくとも1つの主要な依存性注入フレームワークでのAbstract Factoryパターンの直接サポート 。
それらが同じでない場合、違いは何ですか?
これらのパターンを調査しているときに、同じ質問に出くわしました。 Service LocatorとFactoryの間に大きな違いがあると思います(抽象的かどうかは関係ありません)。
私がこれまで読んだことから、違いは次のとおりだと思います。
サービスロケーターパターン
抽象ファクトリパターン
実際、この両方のパターンの間には明確な分離があります。具象型からの依存関係を回避するために両方のパターンが使用されることは一般的に知られています。
しかし読んだ後
いくつかの深刻な矛盾が発生します。
Seemann氏は次のように述べています。「抽象ファクトリはジェネリック型であり、Createメソッドの戻り値の型はファクトリ自体の型によって決定されます。つまり、構築された型は単一の型のインスタンスのみを返すことができます。」
Rober C. Martinはジェネリック型については何も言及していませんでしたが、さらに、彼の本のファクトリの例では、Factory.Make()のパラメータとしてキー文字列を使用して、オブジェクトを区別する複数のタイプのオブジェクトのインスタンスを作成できます。
ガンマは、Abstract Factoryの目的は、「具体的なクラスを指定せずに、関連オブジェクトまたは依存オブジェクトのファミリーを作成するためのインターフェースを提供すること」であると述べました。ガンマ抽象ファクトリの例は、Martinが述べたインターフェイス分離の原則(ISP)に違反していることに言及する価値があります。 ISPとSOLIDは一般的に、より現代的な原則であるか、省略されている場合は簡単にするためです。
ガンマとマーティンの作品はシーマンの作品に先行しているので、彼はすでに作られた定義に従うべきだと思います。
Fowlerは依存性逆転を実装する方法としてServiceLocatorを提案していますが、Seemannはそれをアンチパターンと見なしています。ガンマもマーティンもサービスロケーターについて言及していません。
ただし、SeemannとFowlerは、Service Locatorがconcretesクラスのインスタンスを登録するための構成ステップが必要であることに同意しました。そのインスタンスは、後でその種類のオブジェクトが要求されたときに返されるものです。この構成ステップは、MartinまたはGammaがAbstractFactoryの定義で言及していません。抽象ファクトリパターンは、その種類のオブジェクトが要求されるたびに新しいオブジェクトがインスタンス化されることを前提としています。
結論
ServiceLocatorとAbstractFactoryの主な違いは、Abstract Factoryは、要求されるたびに新しいオブジェクトがインスタンス化されて返されると想定し、Service Locatorはオブジェクトインスタンスで構成する必要があり、毎回同じインスタンスが返されることです。
差出人: http://blog.ploeh.dk/2010/11/01/PatternRecognitionAbstractFactoryorServiceLocator/
抽象ファクトリはジェネリック型であり、Createメソッドの戻り値の型はファクトリ自体の型によって決定されます。つまり、構築された型は単一の型のインスタンスのみを返すことができます。
一方、Service Locatorは、ジェネリックメソッドを使用する非ジェネリックインターフェイスです。単一のServiceLocatorのCreateメソッドは、無限の数のタイプのインスタンスを返すことができます。