考慮用靜態(tài)工廠方法代替構(gòu)造器
Tips:這里的靜態(tài)工廠方法非設(shè)計(jì)模式的靜態(tài)工廠方法
1、相對構(gòu)造器的優(yōu)勢:
1.1、靜態(tài)工廠方法有名稱:
因?yàn)闃?gòu)造器只能有一個(gè)特定的簽名,所以要提供多個(gè)構(gòu)造器必須要通過參數(shù)列表的順序上不同來實(shí)現(xiàn),這樣要求用戶記住各種構(gòu)造器,如果沒有相關(guān)文檔,容易出現(xiàn)錯(cuò)誤。(eclipse中有自動(dòng)檢測功能,不過從語言的角度這樣還是有問題的)而對于靜態(tài)工廠方法,當(dāng)一個(gè)類需要多個(gè)帶有相同標(biāo)簽名得構(gòu)造器時(shí),就用靜態(tài)工廠方法代替構(gòu)造器,并慎重的選擇名稱以便突出它們之間的區(qū)別
1.2、不用每次調(diào)用的時(shí)候都新建一個(gè)對象
Java中創(chuàng)建對象的成本是非常大的,因此使用靜態(tài)工廠方法的同時(shí),可以預(yù)先構(gòu)建好的實(shí)例,或者將構(gòu)建好的實(shí)例緩存起來,進(jìn)行重復(fù)利用,避免創(chuàng)建不必要的對象。
Such as :Boolean.valueOf(),永遠(yuǎn)不創(chuàng)建對象
Public static Boolean valueOf(Boolean b) {
Return b ?
Boolean.TRUE : Boolean.FALSE;
}
Ps:我們自己寫程序的時(shí)候,可以通過enum來控制類在某個(gè)時(shí)刻那些實(shí)例存在。這些類被稱為實(shí)例受控的類。
1.3、可以返回返回原類型的任何子類型的對象
1.3.1、這里將類得子類進(jìn)行隱藏,通過API返回對象,同時(shí)又不會(huì)使對象的類變成共有。同時(shí)這也為針對接口編程提供了便利。因?yàn)榻涌诓荒苡徐o態(tài)方法(靜態(tài)方法屬于類所擁有),則將接口Types中的靜態(tài)工廠方法被放在一個(gè)名為Types的不可實(shí)例化的類中。
API中實(shí)現(xiàn)就是Collecion和Collections。
Collection是java中的集合類的接口,它提供了集合類所共有的方法
Collections是由Collection上進(jìn)行操作或返回Collection的靜態(tài)方法組成。例如它提供了不可修改的集合,同步集合等。通過這種方式比導(dǎo)出32個(gè)獨(dú)立公有類得實(shí)現(xiàn)方式要小得多。
1.3.2、公有的靜態(tài)工廠方法所返回的對象的類不僅可以是非公有的,而且該類還可以隨著每次調(diào)用而發(fā)生變化,這取決于靜態(tài)工廠方法的參數(shù)值。
API中實(shí)現(xiàn)是 EnumSet類
書中說:如果它的元素有64個(gè)或者更少,靜態(tài)工廠方法就返回了一個(gè)RegalarEnumSet實(shí)例,用單個(gè)long支持;如果枚舉類型有65個(gè)或者更多的元素,工廠就返回JumboEnumSet類型,用long數(shù)組進(jìn)行支持。
Ps:查閱了下jdk api沒有找到相關(guān)的內(nèi)容。不過理解上沒什么難度,根據(jù)傳入?yún)?shù)的量。底層動(dòng)態(tài)選擇實(shí)現(xiàn)的方式而已。
1.3.3、靜態(tài)工廠方法返回的對象所屬的累,在編寫該靜態(tài)工廠方法的類時(shí)可以不必存在。
服務(wù)者框架:多個(gè)服務(wù)提供者實(shí)現(xiàn)了一個(gè)服務(wù),系統(tǒng)為服務(wù)提供者的客戶端提供多個(gè)實(shí)現(xiàn),并把他們從多個(gè)實(shí)現(xiàn)中解耦出來。
服務(wù)提供者框架三個(gè)重要的組件:
服務(wù)接口(Service Interface):提供者實(shí)現(xiàn)的;
提供者注冊的API(provider Registration API),系統(tǒng)用來注冊實(shí)現(xiàn)的,讓客戶端返回它們的
服務(wù)訪問API(Service Registration API),客戶端用來獲取服務(wù)的實(shí)例的。
API中實(shí)現(xiàn)是JDBC的服務(wù)
每個(gè)db提供自己的*.Jar包來實(shí)現(xiàn)DB的操作即Driver,它們遵從一套標(biāo)準(zhǔn)。這就是服務(wù)接口
JDK中提供的DriverManagere.registerDriver是提供者注冊的API,
DriverManager.getConnection()是服務(wù)訪問API.
Ps:如果對這一部分不是很理解的話,強(qiáng)烈推薦原書中P7的code…一看就明白了
1.4、在創(chuàng)建參數(shù)化類型實(shí)例的時(shí)候,它們使代碼變得更加簡潔
這里面主要提到的是類型推導(dǎo)(type reference)。所謂類型推導(dǎo),即根據(jù)你定義的返回對象的類型來推導(dǎo)實(shí)例化的類型(個(gè)人感覺雖然很方便,有點(diǎn)不靠譜啊)
書中給的代碼實(shí)例如下:
Public static <K,V> HashMap<K, V> newInstance()
{
return new
HashMap<K, V>();
}
Map<Strinng, List<String>> m = HashMap.newInstance();
2、靜態(tài)工廠的缺點(diǎn)
2.1、類如果不含公有的或者受保護(hù)的構(gòu)造器,就不能被子類化。
這里的主要原因就是,子類的方法的范圍權(quán)限比父類更嚴(yán)格。書中也提到了,這其實(shí)是個(gè)優(yōu)點(diǎn)。因?yàn)榻M合比繼承更應(yīng)該用。
2.2、和其他靜態(tài)方法實(shí)際上沒有任何區(qū)別。
這個(gè)純粹是從java doc方便查詢的角度來說的,so I don’t care it