注:今天看《Effective Java 中文版 第2版》時(shí),發(fā)現(xiàn)在靜態(tài)工廠方法中提到的服務(wù)提供者框架的簡(jiǎn)單實(shí)現(xiàn)代碼不夠完整,所以自己寫了一份完整代碼附帶一些解釋,希望對(duì)大家有所幫助。
Service.java
// 服務(wù)接口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() {} // 把服務(wù)接口的名字映射到Services中 private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>(); public static final String DEFAULT_PROVIDER_NAME = "<def>"; // 提供者注冊(cè)API(默認(rèn)) public static void registerDefaultProvider(Provider p) { registerProvider(DEFAULT_PROVIDER_NAME, p); }
// 提供者注冊(cè)API public static void registerProvider(String name, Provider p) { providers.put(name, p); } // 服務(wù)訪問API(默認(rèn)) public static Service newInstance() { return newInstance(DEFAULT_PROVIDER_NAME); } // 服務(wù)訪問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("開始服務(wù)..."); } }}
Test.java
public class Test { public static void main(String[] args) throws ClassNotFoundException { Class.forName("EntityProvider"); Service s = ServiceManager.newInstance("EntityService"); s.serve();
}}
另推薦幾個(gè)對(duì)服務(wù)提供者框架解釋地不錯(cuò)的博文:
[1]. CSDN. 服務(wù)提供者框架(Service Provider Framework)
[2]. ITEYE. JAVA 服務(wù)提供者框架介紹
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注