web-dev-qa-db-ja.com

ServiceLocatorパターンはAbstractFactoryパターンと何か違いがありますか?

一見すると、ServiceLocatorパターンはAbstractFactoryパターンと同じように見えます。どちらも同じように使用されているようで(抽象サービスのインスタンスを受け取るようにクエリを実行します)、依存性注入について読んだときに両方とも言及されています。

ただし、 Service Locatorパターンが不適切なアイデアとして説明されているのを見ました 、しかし 少なくとも1つの主要な依存性注入フレームワークでのAbstract Factoryパターンの直接サポート

それらが同じでない場合、違いは何ですか?

40

これらのパターンを調査しているときに、同じ質問に出くわしました。 Service LocatorとFactoryの間に大きな違いがあると思います(抽象的かどうかは関係ありません)。

サービスロケーター

  • 'Locates' existing依存関係(サービス)。サービスは解決中に作成される場合がありますが、次の理由でクライアントに影響はありません。
  • サービスロケーターのクライアント所有権を取得しません依存関係。

工場

  • 新しいインスタンスを作成します依存関係の。
  • ファクトリのクライアント所有権を取得依存関係。

抽象ファクトリ

  • 異なるデプロイメントがAbstractFactoryの異なる実装を使用して、それらの異なるデプロイメントで異なるタイプをインスタンス化できることを除いて、通常のファクトリと同じです(Abstract Factoryの実装を実行時に変更することもできますが、通常はそのように使用されません)。
44

私がこれまで読んだことから、違いは次のとおりだと思います。

サービスロケーターパターン

  • どの具象オブジェクトを作成/返却するかについての登録を明示的にサポートします
  • 通常、汎用インターフェイスがあり、ユーザーは特定の型ではなく、任意の抽象型を要求できます。
  • それ自体が具体的かもしれない

抽象ファクトリパターン

  • 登録をサポートしない可能性があります-それはサポートする、またはサポートしない特定の実装次第であり、おそらく抽象インターフェースで公開されないでしょう
  • 通常、特定の抽象型に対して複数のgetメソッドがあります
  • それ自体は具体的ではありません(もちろん具体的な実装がありますが)
13

実際、この両方のパターンの間には明確な分離があります。具象型からの依存関係を回避するために両方のパターンが使用されることは一般的に知られています。

しかし読んだ後

いくつかの深刻な矛盾が発生します。

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はオブジェクトインスタンスで構成する必要があり、毎回同じインスタンスが返されることです。

2
jfuentes

差出人: http://blog.ploeh.dk/2010/11/01/PatternRecognitionAbstractFactoryorServiceLocator/

抽象ファクトリはジェネリック型であり、Createメソッドの戻り値の型はファクトリ自体の型によって決定されます。つまり、構築された型は単一の型のインスタンスのみを返すことができます。

一方、Service Locatorは、ジェネリックメソッドを使用する非ジェネリックインターフェイスです。単一のServiceLocatorのCreateメソッドは、無限の数のタイプのインスタンスを返すことができます。

1
John Smith