![](/img/trans.png)
[英]Java Service Provider Interface for mime-detection in Play Framework?
[英]Service provider framework in java
根據“Effecive java”一書,語句“ 由靜態工廠方法返回的對象的類在編寫包含該方法的類時甚至不需要存在 ”。 表示以下段落:
在編寫包含該方法的類時,靜態工廠方法返回的對象的類甚至不需要存在。 這種靈活的靜態工廠方法構成了服務提供者框架的基礎,例如Java數據庫連接API(JDBC)。 服務提供者框架是一個系統,其中多個服務提供者實現服務,並且系統使實現可用於其客戶端,將它們與實現分離
根據“Effecive java”一書,語句“由靜態工廠方法返回的對象的類在編寫包含該方法的類時甚至不需要存在”。 表示以下段落:
解釋這句話的意思的好方法是考慮EnumSet
類型,它是java.util
包中的一個類。
EnumSet
是一個沒有任何可訪問構造函數的抽象類。 為了獲得EnumSet
實例,程序員使用其靜態工廠方法之一,例如。 EnumSet.of( ... )
。 例如:
Set<MyEnum> s = EnumSet.of(MyEnum.FIRST_CONSTANT);
of()
方法返回的對象沒有EnumSet
的實現類型。 相反,實現類型取決於MyEnum
類。 如果MyEnum
有64個或更少的常量,則of()
返回的對象的類型是RegularEnumSet
。 如果MyClass
有超過64個常量,則返回的對象類型為JumboEnumSet
。 但是,返回的對象的實際類型對程序員來說並不重要。 他或她所關心的是獲得符合EnumSet
合同的某種類型的對象。
現在,讓我們說,哦,五年后,Java語言架構師決定擁有另一個EnumSet
實現類型很重要,比如說,例如,對於具有大量常量(超過1024)的類的緩存枚舉實現)。 他們編寫這個類來遵循EnumSet
合約並調用它:
final CachedEnumSet extends EnumSet {
:
:
}
盡管在編寫EnumSet
時CachedEnumSet
不存在,但使用靜態工廠啟用基於合同的實現系統這一事實使Java架構師能夠在幾年后添加此新實現。
現在,當一個客戶端調用EnumSet.of()
,他或她可以獲得一個RegularEnumSet
對象,一個JumboEnumSet
對象或新的CachedEnumSet
對象,但他們不關心,因為他們得到的對象仍然是EnumSet
的子類型,並且受合同約束。
工廠方法通常會返回一個實現接口的類(或者擴展一個類,同樣的結果)。 但是可以動態定義要返回的實際類。 在這種情況下,寫入工廠方法時不需要存在要返回的類。
可能是最簡單的例子。 JDBC示例類似於DriverManager - 您提供數據庫連接URL。 從該URL,DriverManager需要確定要返回的類。 如果您正在使用Oracle數據庫,它會創建一個Oracle驅動程序類(實現JDBC API),即使DriverManager對Oracle沒有任何了解。
作為一般情況,假設我們的工廠方法返回接口AA。 工廠方法的實現可能會讀取定義要創建的類的配置文件,然后使用反射在運行時創建該類。 定義的類只需要存在於CLASSPATH中。 工廠方法知道如何創建它,但是在編寫工廠方法時實現並不存在。
有很多日常的例子都會出現這種情況:JDBC提供程序,自定義日志記錄appender,XML提供程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.