zoukankan      html  css  js  c++  java
  • Design Pattern

    原文地址:http://www.tutorialspoint.com/design_pattern/service_locator_pattern.htm

    The service locator design pattern is used when we want to locate various services using JNDI lookup. Considering high cost of looking up JNDI for a service, Service Locator pattern makes use of caching technique. For the first time a service is required, Service Locator looks up in JNDI and caches the service object. Further lookup or same service via Service Locator is done in its cache which improves the performance of application to great extent. Following are the entities of this type of design pattern.

    • Service - Actual Service which will process the request. Reference of such service is to be looked upon in JNDI server.

    • Context / Initial Context - JNDI Context carries the reference to service used for lookup purpose.

    • Service Locator - Service Locator is a single point of contact to get services by JNDI lookup caching the services.

    • Cache - Cache to store references of services to reuse them

    • Client - Client is the object that invokes the services via ServiceLocator.

    Implementation

    We are going to create a ServiceLocator,InitialContextCacheService as various objects representing our entities.Service1 and Service2 represent concrete services.

    ServiceLocatorPatternDemo, our demo class, is acting as a client here and will useServiceLocator to demonstrate Service Locator Design Pattern.

    Service Locator Pattern UML Diagram

    Step 1

    Create Service interface.

    Service.java

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

    Step 2

    Create concrete services.

    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";
       }
    }

    Step 3

    Create InitialContext for JNDI lookup

    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;		
       }
    }

    Step 4

    Create Cache

    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);
          }
       }
    }

    Step 5

    Create Service Locator

    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;
       }
    }

    Step 6

    Use the ServiceLocator to demonstrate Service Locator Design Pattern.

    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();		
       }
    }

    Step 7

    Verify the output.

    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
    
  • 相关阅读:
    [官网]CREATE EXTENSION PostGreSQL 创建函数的方法
    Notepad++的一个用法 转换为unix 格式的文件
    LLVM的安装
    Linux 下面RPM 安装的SQLSERVER 修改字符集的方法
    Linux 下面 Sqlserver 2017 的简单安装
    Linux下面将windows写的脚本转换成 Linux 格式的文件
    PostgreSQL 安装了contrib 之后 登录失败的问题
    Linux 下面 PG 的 uuid-ossp 包安装办法
    Chrome 离线安装插件的办法
    [新三板摘牌]国资企业济南华光光电去年终止拟IPO今年摘牌新三板
  • 原文地址:https://www.cnblogs.com/davidwang456/p/4455841.html
Copyright © 2011-2022 走看看