디자인 패턴-서비스 로케이터 패턴

서비스 로케이터 디자인 패턴은 JNDI 조회를 사용하여 다양한 서비스를 찾고자 할 때 사용됩니다. 서비스에 대한 JNDI를 찾는 데 드는 높은 비용을 고려할 때 Service Locator 패턴은 캐싱 기술을 사용합니다. 서비스가 처음으로 필요한 경우 Service Locator는 JNDI에서 조회하고 서비스 객체를 캐시합니다. Service Locator를 통한 추가 조회 또는 동일한 서비스는 캐시에서 수행되어 응용 프로그램의 성능을 크게 향상시킵니다. 다음은 이러한 유형의 디자인 패턴의 엔티티입니다.

  • Service-요청을 처리 할 실제 서비스. 이러한 서비스에 대한 참조는 JNDI 서버에서 찾아 볼 수 있습니다.

  • Context / Initial Context -JNDI Context는 조회 목적으로 사용되는 서비스에 대한 참조를 전달합니다.

  • Service Locator -Service Locator는 서비스를 캐싱하는 JNDI 조회를 통해 서비스를받을 수있는 단일 연락 창구입니다.

  • Cache -재사용을 위해 서비스 참조를 저장하는 캐시

  • Client -Client는 ServiceLocator를 통해 서비스를 호출하는 객체입니다.

이행

우리는 엔티티를 나타내는 다양한 객체로 ServiceLocator , InitialContext , Cache , Service 를 생성 할 것 입니다. Service1Service2 는 구체적인 서비스를 나타냅니다.

ServiceLocatorPatternDemo , 데모 클래스는, 여기에서 클라이언트 역할 및 사용 ServiceLocator를 서비스 로케이터 디자인 패턴을 보여줍니다.

1 단계

서비스 인터페이스를 만듭니다.

Service.java

public interface Service {
   public String getName();
   public void execute();
}

2 단계

구체적인 서비스를 만듭니다.

Service1.java

public class Service1 implements Service {
   public void execute(){
      System.out.println("Executing Service1");
   }

   @Override
   public String getName() {
      return "Service1";
   }
}

Service2.java

public class Service2 implements Service {
   public void execute(){
      System.out.println("Executing Service2");
   }

   @Override
   public String getName() {
      return "Service2";
   }
}

3 단계

JNDI 조회를위한 InitialContext 생성

InitialContext.java

public class InitialContext {
   public Object lookup(String jndiName){
   
      if(jndiName.equalsIgnoreCase("SERVICE1")){
         System.out.println("Looking up and creating a new Service1 object");
         return new Service1();
      }
      else if (jndiName.equalsIgnoreCase("SERVICE2")){
         System.out.println("Looking up and creating a new Service2 object");
         return new Service2();
      }
      return null;		
   }
}

4 단계

캐시 생성

Cache.java

import java.util.ArrayList;
import java.util.List;

public class Cache {

   private List<Service> services;

   public Cache(){
      services = new ArrayList<Service>();
   }

   public Service getService(String serviceName){
   
      for (Service service : services) {
         if(service.getName().equalsIgnoreCase(serviceName)){
            System.out.println("Returning cached  " + serviceName + " object");
            return service;
         }
      }
      return null;
   }

   public void addService(Service newService){
      boolean exists = false;
      
      for (Service service : services) {
         if(service.getName().equalsIgnoreCase(newService.getName())){
            exists = true;
         }
      }
      if(!exists){
         services.add(newService);
      }
   }
}

5 단계

서비스 로케이터 생성

ServiceLocator.java

public class ServiceLocator {
   private static Cache cache;

   static {
      cache = new Cache();		
   }

   public static Service getService(String jndiName){

      Service service = cache.getService(jndiName);

      if(service != null){
         return service;
      }

      InitialContext context = new InitialContext();
      Service service1 = (Service)context.lookup(jndiName);
      cache.addService(service1);
      return service1;
   }
}

6 단계

ServiceLocator 를 사용하여 Service Locator 디자인 패턴을 시연 하십시오 .

ServiceLocatorPatternDemo.java

public class ServiceLocatorPatternDemo {
   public static void main(String[] args) {
      Service service = ServiceLocator.getService("Service1");
      service.execute();
      service = ServiceLocator.getService("Service2");
      service.execute();
      service = ServiceLocator.getService("Service1");
      service.execute();
      service = ServiceLocator.getService("Service2");
      service.execute();		
   }
}

7 단계

출력을 확인하십시오.

Looking up and creating a new Service1 object
Executing Service1
Looking up and creating a new Service2 object
Executing Service2
Returning cached  Service1 object
Executing Service1
Returning cached  Service2 object
Executing Service2