2012-08-06 95 views
10

Effective Java理解后面像JDBC服务提供程序框架的概念(项目1考虑静态工厂方法代替构造):使用工厂方法

类由静态返回的对象的在写入包含该方法的类时,工厂方法甚至不需要存在 。这种灵活的静态工厂方法构成了服务提供者框架的基础,例如Java Database Database Connectivity(JDBC)。服务提供者框架是多个服务提供者实现服务的系统,并且系统使得其实现 对其客户可用,从而将它们从实现中解耦。

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

+0

看到这个链接:https://docs.oracle.com/javase/tutorial/ext/basics/spi.html – Malav 2017-03-31 05:49:21

回答

27

考虑类似如下:

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,它必须有一个公共的无参数构造函数(否则,上面的工厂将抛出一个Error)。

+0

+1:伟大而简单的方法来解决这个问题。 – 2012-08-06 07:15:44

1

系统作出的实现提供给其客户,从实现

只是把它在简单的方式,你不必在编译时添加这些JDBC厂商的任何依赖解耦他们。客户可以在运行时

添加自己