服务定位器模式(service locator pattern)用在我们想使用 jndi 查询定位各种服务的时候。考虑到为某个服务查找 jndi 的代价很高,服务定位器模式充分利用了缓存技术。在首次请求某个服务时,服务定位器在 jndi 中查找服务,并缓存该服务对象。当再次请求相同的服务时,服务定位器会在它的缓存中查找,这样可以在很大程度上提高应用程序的性能。以下是这种设计模式的实体。
我们将创建 servicelocator、initialcontext、cache、service 作为表示实体的各种对象。service1 和 service2 表示实体服务。
servicelocatorpatterndemo,我们的演示类在这里是作为一个客户端,将使用 servicelocator 来演示服务定位器设计模式。
创建服务接口 service。
service.java
public interface service { public string getname(); public void execute(); }
创建实体服务。
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"; } }
为 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; } }
创建缓存 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); } } }
创建服务定位器。
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; } }
使用 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(); } }
验证输出。
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