服务定位器模式(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