使用工厂方法了解JDBC之类的服务提供者框架背后的概念

从Effective Java ( 第1项考虑静态工厂方法而不是构造函数 ):

在编写包含该方法的类时,静态工厂方法返回的对象的类甚至不需要存在。 这种灵活的静态工厂方法构成了服务提供者框架的基础,例如Java数据库连接API(JDBC)。 服务提供者框架是多个服务提供者实现服务的系统,并且系统使实现可用于其客户端,从而将它们与实现分离。

我特别不明白为什么这本书说的是静态工厂方法返回的对象的类在编写包含该方法的类时甚至不需要存在? 有人可以用JDBC作为例子来解释。

考虑以下内容:

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并且它必须有一个public,no-arg构造函数(否则,上面的工厂将抛出一个Error )。

系统使实现可用于客户端,将它们与实现分离

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