注:今天看《Effective Java 中文版 第2版》时,发现在静态工厂方法中提到的服务提供者框架的简单实现代码不够完整,所以自己写了一份完整代码附带一些解释,希望对大家有所帮助。
Service.java
// 服务接口public interface Service { public abstract void serve();}
PRovider.java
// 提供者接口public interface Provider { Service newService();}
ServiceManager.java
import java.util.Map;import java.util.concurrent.ConcurrentHashMap;public class ServiceManager { private ServiceManager() {} // 把服务接口的名字映射到Services中 private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>(); public static final String DEFAULT_PROVIDER_NAME = "<def>"; // 提供者注册API(默认) public static void registerDefaultProvider(Provider p) { registerProvider(DEFAULT_PROVIDER_NAME, p); }
// 提供者注册API public static void registerProvider(String name, Provider p) { providers.put(name, p); } // 服务访问API(默认) public static Service newInstance() { return newInstance(DEFAULT_PROVIDER_NAME); } // 服务访问API
public static Service newInstance(String name) { Provider p = providers.get(name); if(p == null) { throw new IllegalArgumentException("No provider registered with name: " + name); } return p.newService(); }}
EntityProvider.java
public class EntityProvider implements Provider { static { ServiceManager.registerProvider("EntityService", new EntityProvider()); } @Override public Service newService() { return new ServiceImpl(); } class ServiceImpl implements Service { @Override public void serve() { System.out.println("开始服务..."); } }}
Test.java
public class Test { public static void main(String[] args) throws ClassNotFoundException { Class.forName("EntityProvider"); Service s = ServiceManager.newInstance("EntityService"); s.serve();
}}
另推荐几个对服务提供者框架解释地不错的博文:
[1]. CSDN. 服务提供者框架(Service Provider Framework)
[2]. ITEYE. JAVA 服务提供者框架介绍
新闻热点
疑难解答