2016-09-23 5 views
1

私は存在の疑いがあります。私はServiceLocatorパターンの実装をC++でいくつかのブログで見た(Service Locator)。したがって、私はJava SE上で同じ実装を拡張しようとしています(それ以外のフレームワークはありません)。コードの下を参照してください。javaのServiceLocatorパターンのこの有効な実装ですか?

私の質問:それはjavaのServiceLocatorパターンの有効な実装ですか?そうでない場合は、Javaでこのパターンの最も単純な(実装の)実装は何でしょうか?

/** 
* Where MyService1 and MyService2 are interfaces. 
*/ 
public final class MyServiceLocator { 

private static MyService1 service1; 

private static MyService2 service2; 

private MyServiceLocator() { 
    // No op 
} 

public static MyService1 getMyService1() { 
    if (service1 == null) { 
     throw new NullMyService1Exception(); 
    } 
    return service1; 
} 

public static MyService2 getMyService2() { 
    if (service2 == null) { 
     throw new NullMyService2Exception(); 
    } 
    return service2; 
} 

public static void provideService1(MyService1 service1) { 
    // Initialize Service1 
    ... 
    MyServiceLocator.service1 = service1; 
} 

public static void provideService2(MyService2 service2) { 
    // Initialize Service2 
    ... 
    MyServiceLocator .service2 = service2; 
} 

}

+0

あなたは[java.util.ServiceLoaderクラス](http://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html)を知っていますか?学術的な理由からこれを実行しようとしている場合、サービスロケータのポイントは、特定のタイプのサービスを発見するための明確に定義されたアルゴリズムを持つか、または公共のサービスレジストリを持つことですそれ自身を登録する。あなたのコードはどちらもしないようです。 – VGR

+0

存在の疑い?かなり深刻な音... – shmosel

+0

こんにちは@shmoselは、私はそれについて多くの疑問を持っていると言う方法は、誰もそれのために死ぬだろう。ご注意いただきありがとうございます。 – Ariel

答えて

1

説明したように基本的に私はむしろ、各サービスのためのユニークなゲッター/セッターを有するよりも単一のアクセス方法を使用して、キャッシング戦略&の不在以外のサービス・ロケータパターンに従って実装に問題を見ませんいくつかの情報源で。 Thisはもっと明確な例かもしれません。

しかし、それはterribleパターンのように見えます。それの必要性は何ですか? sourceが示唆しているように、共通のインターフェイスを実装している一連のワーカークラスを格納し、Singletonsを使わずにクライアントに公開する方法です。

これは拡張性の点ではまったく良い解決策ではありません。より多くのサービスに追加する必要があるときはどうなりますか?あなたはどの

  • は(私が入れたソースで説明したように)任意のサービスを見つけるために使用されるすべてのif-elseはしごを再現(あなたの方法で)より多くのメソッドを追加していかなりひどいです。

    あなたは(すなわち、同じインタフェースを実装)クライアントに同じ機能を公開しているサービスのセットを持っている場合は、共通の動作を維持し、それらを公開するための最良の方法は、Dependency-Injectionまたは

  • パターン。

関連する問題