服务定位器模式(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
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
为 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;
}
}
步骤 4
创建缓存 cache。
cache.java
import java.util.arraylist;
import java.util.list;
public class cache {
private list
public cache(){
services = new arraylist
}
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
执行程序,输出结果:
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