静态工厂方法之服务提供者框架

  静态工厂返回的对象所属的类,在编写包含该静态工厂方法的类的时候,可以不必存在.这种灵活的静态工厂方法构成了服务提供者框架的基础,例如JDBC的API.服务提供者框架是指这样一个系统:多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现.并把它们从多个实现中解耦出来.

  服务提供者框架包含四大组件-服务接口(提供者实现),提供者注册API(由系统用来注册实现),服务访问API(客户端用来访问服务的实例),服务提供者接口(服务者负责创建其服务实现的实例).下面的例子就是服务提供者框架的具体实现:

  首先是服务接口和服务提供者接口,服务提供者用来产生服务:

/**
 * 
 * @author 胡龙海
 * 创建时间: 2017年4月4日
 * 服务接口
 */
public interface Service {
    //Service方法.
    public void doService();
}
/**
 * 
 * @author 胡龙海
 * 创建时间: 2017年4月4日
 * 服务提供者接口
 */
public interface Provider {
    public Service newService();
}

  紧接着是服务提供者接口的实现和服务接口的实现:

public class StrongProvider implements Provider{

    @Override
    public Service newService() {
        return new StrongService();
    }
    
}
public class WeekProvider implements Provider{

    @Override
    public Service newService() {
        return new WeekService();
    }

}
public class WeekService implements Service{

    @Override
    public void doService() {
        System.out.println("弱爆了");
    }

}
public class StrongService implements Service{

    @Override
    public void doService() {
        System.out.println("双击666");
    }

}

  紧接着就是提供静态工厂了,我们通过静态工厂完成服务访问API,服务提供者注册API的编写:

/**
 * 静态工厂,提供服务
 * @author 胡龙海
 * 创建时间: 2017年4月4日
 */
public class Services {
    private Services(){}    //保证该类是不可实例化的
    private static Map<String,Provider> providers=new HashMap<>();//一系列服务提供者
    private static String DEFAULT_PROVIDER_NAME="<def>";
    /**
     * 提供者注册API.(默认)
     * @author 胡龙海
     * 创建时间: 2017年4月4日
     * @param provider
     */
    public static void registDefaultProvider(Provider provider) {
        providers.put(DEFAULT_PROVIDER_NAME, provider);
    }
    /**
     * 提供者注册API
     * @author 胡龙海
     * 创建时间: 2017年4月4日
     * @param providerName
     * @param provider
     */
    public static void registProvider(String providerName,Provider provider) {
        providers.put(providerName, provider);
    }
    /**
     * 服务访问API,默认
     * @author 胡龙海
     * 创建时间: 2017年4月4日
     * @return
     */
    public static Service newService() {
        return providers.get(DEFAULT_PROVIDER_NAME).newService();
    }
    /**
     * 服务访问API.
     * @author 胡龙海
     * 创建时间: 2017年4月4日
     * @param serviceName
     * @return
     */
    public static Service newService(String serviceName) {
        return providers.get(serviceName).newService();
    }
}

  接着,我们就可以建立代码去测试了.可以去注册几个服务提供者,然后根据注册时的名字完成对于服务的调用.

public class TestService {
    @Test
    public void testService() {
        Services.registProvider("week",new WeekProvider());
        Services.registProvider("strong", new StrongProvider());
        Services.registDefaultProvider(new StrongProvider());
        Services.newService().doService();
        Services.newService("week").doService();
    }
}

  实际上,我们熟悉的JDBC编程就是基于这种服务提供者框架去实现的,其中Driver是服务提供者接口,Connection是服务接口,DriverManager.registDriver()是服务提供者注册API,而DriverManager.getConnection()是服务访问API.

posted @ 2017-04-04 20:08  hlhdidi  阅读(831)  评论(0编辑  收藏  举报