Latest web development tutorials

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

私たちはときにJNDIルックアップサービスを利用したいの位置決めに使用するためのサービスロケータパターン(サービスロケータパターン)。 サービス、キャッシング技術のサービスロケータパターンをフルに活用するためにアカウントにJNDIルックアップ高い価格を取ります。 サービスの最初の要求、JNDIルックアップサービスロケータでサービスで、サービスオブジェクトをキャッシュします。 再び同じサービスを要求すると、サービスロケータを大幅にアプリケーションのパフォーマンスを向上させることができ、そのキャッシュに見えます。 以下は、このデザインパターンの実体です。

  • サービス(サービス) -実際に要求を処理するサービスを提供しています。これらのサービスへの参照は、JNDIサーバーで見つけることができます。
  • コンテキスト/初期コンテキスト-あなたが参照を検索するサービスとJNDIコンテキスト
  • サービスロケータ(サービスロケータ) -サービスロケータは、コンタクトサービスの単一のポイントを取得するためにJNDIルックアップおよびキャッシングサービスを介して行われます。
  • キャッシュ(キャッシュ) -それらを再利用するためのキャッシュストレージサービスへの参照、。
  • クライアント(クライアント) -のServiceLocatorを介してサービスのクライアントオブジェクトの呼び出し。

実現

エンティティは、様々なオブジェクトを表すように我々はのServiceLocator、InitialContextの、キャッシュ、サービスを作成します。サービス1サービス2は、エンティティのサービスを表します。

ServiceLocatorPatternDemo、ここではクライアントとして私たちのデモクラスには、ServiceLocatorは、サービスロケータ設計パターンを実証するために使用されます。

サービスロケータパターンUMLダイアグラム

ステップ1

サービス・インターフェース・サービスを作成します。

Service.java

パブリックインターフェイスのサービス{
   公共の文字列のgetName();
   公共ボイドは()を実行します。
}

ステップ2

サービスエンティティを作成します。

Service1.java

パブリッククラスサービス1は、サービスを{実装します
   公共ボイド(実行){
      System.out.println( "実行サービス1");
   }

   @Override
   公共の文字列のgetName(){
      「サービス1」を返します。
   }
}

Service2.java

パブリッククラスサービス2は、サービスを{実装します
   公共ボイド(実行){
      System.out.println( "実行サービス2");
   }

   @Override
   公共の文字列のgetName(){
      「サービス2」を返します。
   }
}

ステップ3

JNDIのInitialContextのためのクエリを作成します。

InitialContext.java

パブリッククラスInitialContextの{
   パブリックオブジェクトの参照(文字列のjndiName){
      場合(jndiName.equalsIgnoreCase(「SERVICE1 ")){
         System.out.println( "見上げると新しいService1のオブジェクトを作成");
         新しいサービス1を返します();
      }エルス場合(jndiName.equalsIgnoreCase(「サービス2」)){
         System.out.println( "見上げると、新しいサービス2オブジェクトを作成");
         新しいサービス2を返します();
      }
      ヌルを返します。		
   }
}

ステップ4

キャッシュキャッシュを作成します。

Cache.java

輸入はjava.util.ArrayList;
輸入java.util.Listに。

パブリッククラスキャッシュ{

   プライベートリスト<サービス>サービス。

   公共のキャッシュ(){
      サービス=新しいのArrayList <サービス>();
   }

   公共サービスのgetService(文字列serviceNameを){
      用(Serviceサービス:サービス){
         場合(service.getName()。equalsIgnoreCase(serviceNameを)){
            System.out.println( "戻って、キャッシュされた" + serviceNameを+ "オブジェクト");
            サービスを返します。
         }
      }
      ヌルを返します。
   }

   公共ボイドのaddService(サービスnewService){
      ブール= falseの場合に存在します。
      用(Serviceサービス:サービス){
         場合(service.getName()。equalsIgnoreCase(newService.getName())){
            真=存在します。
         }
      }
      {(!が存在する)場合
         services.add(newService)。
      }
   }
}

ステップ5

サービスロケータを作成します。

ServiceLocator.java

パブリッククラスのServiceLocator {
   プライベート静的キャッシュのキャッシュ;

   静的{
      キャッシュ=新しいキャッシュ();		
   }

   パブリック静的サービスのgetService(文字列のjndiName){

      Serviceサービス= cache.getService(のjndiName)。

      場合(サービス!= NULL){
         サービスを返します。
      }

      InitialContextのコンテキスト=新しいのInitialContext();
      サービスサービス1 =(サービス)をcontext.lookup(のjndiName)。
      cache.addService(サービス1)。
      サービス1を返します。
   }
}

ステップ6

サービスロケータデザインパターンを実証するためのServiceLocatorを使用してください。

ServiceLocatorPatternDemo.java

パブリッククラスServiceLocatorPatternDemo {
   公共の静的な無効メイン(文字列[] args){
      Serviceサービス= ServiceLocator.getService(「サービス1」)。
      service.execute()。
      サービス= ServiceLocator.getService(「サービス2 ");
      service.execute()。
      サービス= ServiceLocator.getService(「サービス1」)。
      service.execute()。
      サービス= ServiceLocator.getService(「サービス2 ");
      service.execute()。		
   }
}

ステップ7

出力を確認します。

見上げると、新しいService1のオブジェクトを作成します
サービス1の実行
見上げると、新しいサービス2オブジェクトを作成します
サービス2の実行
キャッシュされたService1のオブジェクトを返します
サービス1の実行
キャッシュされたサービス2オブジェクトを返します
サービス2の実行