42

一見すると、Service Locator パターンは Abstract Factory パターンと同じように見えます。どちらも同じ用途のようで (抽象サービスのインスタンスを受け取るためにクエリを実行します)、どちらも Dependency Injection について読んだときに言及されました。

ただし、Service Locator パターンが不適切なアイデアとして説明されているのを見たことがありますが、少なくとも 1 つの主要な Dependency Injection フレームワークで Abstract Factory パターンが直接サポートされているのを見てきました。

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

4

5 に答える 5

46

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

サービスロケーター

  • 既存の依存関係 (サービス) を「検索」します。サービスは解決中に作成される場合がありますが、次の理由により、クライアントにとって重要ではありません。
  • Service Locator のクライアントは、依存関係の所有権を取得しません。

工場

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

抽象工場

  • 通常のファクトリと同じですが、展開が異なると抽象ファクトリの異なる実装が使用される場合があり、異なる展開で異なる型をインスタンス化できる点が異なります (実行時に抽象ファクトリの実装を変更することもできますが、通常はそのようには使用されません)。
于 2012-02-22T22:05:02.737 に答える
13

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

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

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

抽象工場パターン

  • 登録をサポートしない可能性があります - これは、サポートするかサポートしないかの特定の実装次第であり、おそらく抽象インターフェイスでは公開されません。
  • 通常、特定の抽象型に対して複数の get メソッドがあります
  • それ自体は具体的ではありません(もちろん、具体的な実装があります)
于 2011-04-18T02:46:42.957 に答える
2

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

しかし、読んだ後

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

Seemann 氏は次のように述べています。

Rober C. Martin はジェネリック型については何も言及していませんでしたが、彼の本のファクトリの例では、Factory.Make() のパラメーターとしてキー文字列を使用して、複数の型のオブジェクトのインスタンスを作成できます。

ガンマ氏によると、Abstract Factory の目的は、「具体的なクラスを指定せずに、関連オブジェクトまたは依存オブジェクトのファミリを作成するためのインターフェイスを提供する」ことです。Gamma Abstract Factory の例は、Martin が述べた Interface Segregation Principle (ISP) に違反していることに言及する価値があります。一般に、ISP と SOLID はより現代的な原則であるか、単純化のために省略されている場合があります。

Gamma と Martin の作品は Seemann の作品に先行しているので、彼は既に作成された定義に従うべきだと思います。

Fowler は Service Locator を Dependency Inversion を実装する方法として提案していますが、Seemann はそれをアンチパターンと考えています。Gamma も Martin も Service Locator について言及していません。

ただし、Seemann と Fowler は、Service Locator が具体的なクラスのインスタンスを登録するための構成手順を必要とすることに同意しました。そのインスタンスは、その種類のオブジェクトが要求されたときに後で返されるものです。この構成ステップは、Abstract Factory の定義で Martin または Gamma によって言及されていません。抽象ファクトリ パターンでは、その種類のオブジェクトが要求されるたびに新しいオブジェクトがインスタンス化されると仮定します。

結論

Service Locator と Abstract Factory の主な違いは、Abstract Factory では新しいオブジェクトがインスタンス化され、要求されるたびに返されると仮定し、Service Locator はオブジェクト インスタンスで構成する必要があり、毎回同じインスタンスが返されることです。

于 2015-02-08T02:51:10.297 に答える