服务提供者框架:是只这样的一个框架,多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把他们从多个实例中解耦出来。
服务提供者框架的组成:
服务接口(Service Interface):提供者实现的接口,为服务实现者提供统一的抽象接口,换句话说是客户端调用的接口,由服务提供者实现。
提供者注册API(Provider Registeration API):服务提供者注册的API,用于注册服务提供者,客户端可以访问它实现的服务。
服务访问API(Service access API):访问API获取相应的服务。
服务提供者接口(Service Provider Interface ):服务提供者接口,这些服务提供者负责创建服务实现的实例。
具体实现一个实例:
1.服务接口
/**
* 服务的接口
* 此接口提供一组标准供客户端调用,多个服务提供者实现这个接口
* */
public interface DatabseService {
public String getConnection();
}
2.服务接口实现(两个)
public class MySQLService implements DatabseService {
@Override
public String getConnection() {
return "获得MYSQL的连接";
}
}
public class OracleService implements DatabseService {
@Override
public String getConnection() {
return "获得Oracle连接";
}
}
3.服务提供者接口
/**
* 服务提供者类
* function:负责实例化服务,并且注册到services中
*/
public class MySQLServiceProvider implements ServiceProvider {
static {
Services.RegisterProvider("MySQL", new MySQLServiceProvider());
}
@Override
public DatabseService getDatabseService() {
return new MySQLService();
}
}
OracleProvider也必须的实现,根据需求去实现。如果扩展到其他数据库的连接(如DB等)
4.服务管理(此类中包含有服务提供者注册API和服务访问API)
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class Services {
private Services(){};
private static final Map<String, ServiceProvider> providers =
new ConcurrentHashMap<String, ServiceProvider>();
public static final String DEFAULT_PROVIDER_NAME="MySQL";
/*服务提供者注册方法*/
public static void RegisterDeafultProvider(ServiceProvider p){
providers.put(DEFAULT_PROVIDER_NAME, p);
}
public static void RegisterProvider(String name ,ServiceProvider p){
providers.put(name, p);
}
/*服务访问API*/
public static DatabseService newInstance(){
return newInstance(DEFAULT_PROVIDER_NAME);
}
public static DatabseService newInstance(String name){
ServiceProvider p = providers.get(name);
if(p==null)
throw new IllegalArgumentException("No Provider registered with name"+name);
return p.getDatabseService();
}
}
5.测试类:
public class Test {
public static void main(String[] args) {
try {
Class.forName("org.effectivejava.examples.chapter02.serviceFramework.MySQLServiceProvider");
DatabseService ds = Services.newInstance("MySQL");
Class.forName("org.effectivejava.examples.chapter02.serviceFramework.OracleProvider");
try{
DatabseService dsa = Services.newInstance("Oracle");
System.out.println(dsa.getConnection());
}catch(Exception e){
e.printStackTrace();
}
System.out.println(ds.getConnection());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
这就是模拟各种数据库连接驱动的实现过程。数据库的驱动就是一个服务提供者框架。