2012-08-06 119 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廠商的任何依賴解耦他們。客戶可以在運行時

添加自己