2011-11-30 2 views

答えて

20

工場は、あなたのためのオブジェクトを作成し、初めのために良いことです。

サービスロケータは、既に存在する可能性のあるオブジェクト、つまりあなたのためにすでに存在する可能性のあるサービスを返します。

は名前だけの意味を考える:

  • ファクトリー:オブジェクトが作成される場所です。
  • サービス:サービスとして何かを行うことができるものです。
  • サービスロケータ:サービスを実行できるものを見つけることができるものです。
+0

最後のサービスは何かをするクラスです。それを取得するには、それを作成する必要があります。サービスロケータは、「新しい」サービスを作る必要があるため、工場のようです – toroveneno

+3

新しいサービスオブジェクトを作成する必要はありません...代わりにサービスオブジェクトが作成されますアプリケーションを起動しようとする前に登録されている場合、アプリケーションが起動すると、サービスロケータがそのサービスを呼び出し元に返すことができるようになります。 –

+0

回答の「簡潔さ」と同様 – Spock

6

実際には、両方のパターンが明確に分離されています。どちらのパターンも具体的な型からの依存を避けるために使用されることはよく知られています。ローベルC. Martinによる

しかし後

  • アジャイルソフトウェア開発、原則、パターン、およびプラクティスを読む[書籍]
  • コントロールコンテナと依存性注入パターンの反転[記事] Martin Fowler氏によるでhttp://martinfowler.com/articles/injection.html
  • パターン認識:要約工場またはサービスロケータ? Erich Gamma氏ら

いくつかの深刻な矛盾によってhttp://blog.ploeh.dk/2010/11/01/PatternRecognitionAbstractFactoryorServiceLocator/

  • デザインパターン[ブック]でマーク・シーマンによって[記事]は起こる:

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

    Rober C. Martinはgeneric型について何も言及しておらず、さらに彼の本のfactoryの例では、Factory.Makeのパラメータとしてキー文字列を使用して複数のオブジェクトのインスタンスを区別できます()。

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

    ガンマとマーティンの作品はセーマンズに先行しているので、彼は既に定義されたものに従うべきだと思います。

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

    しかし、SeemannとFowlerは、Service LocatorがConcretesクラスのインスタンスを登録するための設定ステップが必要であることに同意しました。そのインスタンスは、そのようなオブジェクトが要求されたときに後で返されるものです。この構成ステップは、Abstract Factoryの定義においてMartinまたはGammaによって言及されていません。抽象ファクトリパターンは、そのような種類のオブジェクトが要求されるたびにインスタンス化される新しいオブジェクトを想定します。サービスロケータと抽象工場の主な違いは、抽象工場は新しいオブジェクトが各要求で返され、サービスロケータがオブジェクトインスタンスたびに設定する必要がインスタンス化されると仮定していることである

    結論

    同じインスタンスが返されます。

  • 関連する問題