理解服务提供者框架的概念,比如使用工厂方法的JDBC

35

来自《Effective Java》第1条: 考虑使用静态工厂方法代替构造函数):

由静态工厂方法返回的对象所属的类甚至不必在包含该方法的类编写时存在。这种灵活的静态工厂方法构成了服务提供者框架的基础,例如Java Database Connectivity API(JDBC)。服务提供者框架是一个系统,其中多个服务提供者实现服务,并且将这些实现提供给客户端,使其与实现分离。

我特别不理解为什么这本书说由静态工厂方法返回的对象所属的类甚至不必在包含该方法的类编写时存在?可以用JDBC作为例子解释吗?


1
请查看此链接:https://docs.oracle.com/javase/tutorial/ext/basics/spi.html - Bhagwati Malav
3
快速服务提供者教程,比官方文档更好(在我看来):https://www.journaldev.com/31602/java-spi-service-provider-interface-and-serviceloader - Andrejs
2个回答

65
考虑以下内容:

类似以下内容:

public interface MyService {
  void doSomething();
}

public class MyServiceFactory {
  public static MyService getService() {
    try {
      (MyService) Class.forName(System.getProperty("MyServiceImplemetation")).newInstance();
    } catch (Throwable t) {
      throw new Error(t);
    }
  }
}

使用这段代码,您的库不需要了解服务实现。您的库的用户必须设置一个包含他们想要使用的实现名称的系统属性。
这就是所谓的工厂方法将返回某个类的实例(其名称存储在系统属性“MyServiceImplementation”中),但它绝对不知道它是什么类。它所知道的只是它实现了MyService,并且它必须有一个公共的、无参构造函数(否则,上面的工厂将抛出一个错误)。请保留html标记。

6

该系统使其实现对客户端可用,将客户端与实现解耦

简单来说,您不需要在编译时添加这些JDBC供应商的任何依赖项。客户端可以在运行时添加自己的依赖项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接