//Service interface public interface Service{ //Service-specific methods go here } //Service Provider interface public interface Provider{ Service newService(); } //不可实例化的类,用于注册和访问 public class Services{ private Services(){}//防止实例化 public 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); } public static void registerProvider(String name,Provider p){ providers.put(name, p); } //提供者访问API public static Service newInstance(){ return newInstance(DEFAULT_PROVIDER_NAME); } public static Service newInstance(String name){ Provider p = providers.get(name); if (p==null){ throw new IllegalArgumentException("没有这个服务提供者"); return p.newService(); } } }
Connection接口就是一个服务接口,定义了很多操作,但是JDBC本身不对该服务进行实现,而是由mysql,sqlServer、Oracle、DB2等各数据库厂商去实现。DriverManager.registerDriver是提供者注册API, 用户只需要根据注册时的KEY 去查找到相关的服务即可。DriverManager,getConnection是服务访问API。Driver就是服务提供者接口。
举mysql为例:
Class.forName("com.mysql.jdbc.Driver"); DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123");com.sql.jdbc.Driver是一个服务提供者,他提供服务,并注册到DriverManager中。
Map<String,List<String>> m = new HashMap<String,List<String>>();假设HashMap采用了静态工厂的方法,如下:
public static <K,V> HashMap<K,V> new Instance(){ return new HashMap<K,V>(); }那么他的构造方法将可以简写成:
Map<String,List<String,List<String>> m = HashMap.newInstance();