33-Java服务定位器模式 (Service Locator Pattern)

Java服务定位器模式

  • 服务定位器模式(Service Locator Pattern)用于想使用 JNDI 查询定位各种服务的时候

  • 考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术

  • 在首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象

  • 当再次请求相同的服务时,服务定位器会在它的缓存中查找,这样可以在很大程度上提高应用程序的性能

  • 以下是这种设计模式的实体:

    • 服务(Service) - 实际处理请求的服务。对这种服务的引用可以在 JNDI 服务器中查找到
    • Context / 初始的 Context - JNDI Context 带有对要查找的服务的引用
    • 服务定位器(Service Locator) - 服务定位器是通过 JNDI 查找和缓存服务来获取服务的单点接触
    • 缓存(Cache) - 缓存存储服务的引用,以便复用它们
    • 客户端(Client) - Client 是通过 ServiceLocator 调用服务的对象

实现

  • 创建 ServiceLocator 、 InitialContext 、 Cache 、 Service 作为表示实体的各种对象
  • Service1 和 Service2 表示实体服务
  • ServiceLocatorPatternDemo ,我们的演示类在这里是作为一个客户端,将使用 ServiceLocator 来演示服务定位器设计模式

范例

1. 创建服务接口 Service

Service.java

java 复制代码
package com.demo.gof;
public interface Service{
   public String getName();
   public void execute();
}

2. 创建实体服务

Service1.java

java 复制代码
package com.demo.gof;
public class Service1 implements Service {
   public void execute(){
      System.out.println("Executing Service1");
   }

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

Service2.java

java 复制代码
package com.demo.gof;
public class Service2 implements Service {
   public void execute(){
      System.out.println("Executing Service2");
   }

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

3. 为 JNDI 查询创建 InitialContext

InitialContext.java

java 复制代码
package com.demo.gof;
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

Cache.java

java 复制代码
package com.demo.gof;
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

ServiceLocator.java

java 复制代码
package com.demo.gof;
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

java 复制代码
package com.demo.gof;
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();        
   }
}

编译运行以上 Java 范例,输出结果如下

```java
$ javac -d . src/main/com.demo/gof/ServiceLocatorPatternDemo.java
$ java  com.demo.gof.ServiceLocatorPatternDemo
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
相关推荐
DB菜鸟21 分钟前
Grafana Username password invalid
java·服务器·grafana
程序员老王wd27 分钟前
java xml 文本解析
xml·java
ChinaRainbowSea1 小时前
3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)
java·spring boot·后端·spring·spring cloud·eureka
石牌桥网管1 小时前
用正则表达式检查是IP否为内网地址
java·c++·golang·正则表达式·php·c
武子康1 小时前
Java-01 深入浅出 MyBatis - MyBatis 概念 ORM映射关系 常见ORM 详细发展历史
java·数据库·sql·spring·mybatis·springboot·springcloud
kinnisoy1 小时前
Zotero 7本地pdf文件名自适应中英文格式
android·java·pdf
JavaEdge.2 小时前
ShardingSphere如何轻松驾驭Seata柔性分布式事务?
java
不修×蝙蝠2 小时前
Java重点---值传递和引用传递
java·值传递·引用传递·java重点
咩咩觉主2 小时前
C# x Unity 从玩家控制类去分析命令模式该如何使用
设计模式·命令模式
chusheng18402 小时前
基于Java Web 的家乡特色菜推荐系统
java·开发语言·前端·springboot·家乡特色菜推荐系统·家乡特色菜推荐