Шаблон проектирования локатора сервиса используется, когда мы хотим найти различные сервисы, используя поиск JNDI. Учитывая высокую стоимость поиска JNDI для службы, шаблон Service Locator использует технику кэширования. В первый раз, когда требуется сервис, сервисный локатор ищет в JNDI и кэширует объект сервиса. Дальнейший поиск или аналогичный сервис через Service Locator выполняется в его кеше, что значительно повышает производительность приложения. Ниже приведены сущности этого типа шаблона проектирования.
-
Сервис — Фактический Сервис, который обработает запрос. Ссылка на такую услугу должна быть найдена на сервере JNDI.
-
Контекст / начальный контекст — Контекст JNDI содержит ссылку на сервис, используемый для поиска.
-
Сервисный локатор — Сервисный локатор — это единая точка контакта для получения услуг путем поиска в кэше JNDI.
-
Cache — кэш для хранения ссылок на сервисы для их повторного использования
-
Клиент — Клиент — это объект, который вызывает сервисы через ServiceLocator.
Сервис — Фактический Сервис, который обработает запрос. Ссылка на такую услугу должна быть найдена на сервере JNDI.
Контекст / начальный контекст — Контекст JNDI содержит ссылку на сервис, используемый для поиска.
Сервисный локатор — Сервисный локатор — это единая точка контакта для получения услуг путем поиска в кэше JNDI.
Cache — кэш для хранения ссылок на сервисы для их повторного использования
Клиент — Клиент — это объект, который вызывает сервисы через ServiceLocator.
Реализация
Мы собираемся создать ServiceLocator , InitialContext , Cache , Service как различные объекты, представляющие наши сущности. Service1 и Service2 представляют конкретные услуги.
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
Создать InitialContext для поиска JNDI
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, чтобы продемонстрировать шаблон проектирования локатора службы.
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
Проверьте вывод.