静态工厂返回的对象所属的类,在编写包含该静态工厂方法的类的时候,可以不必存在.这种灵活的静态工厂方法构成了服务提供者框架的基础,例如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.