1樓:Allbet
我也有看這本書,這是書中說的第三個優點,可以這麼理解,就是定義乙個public的介面,這個介面定義了我們對外提供的功能,我們用好幾個不同的非public類,都實現這個介面。
再寫乙個對外暴露的類,提供靜態工廠方法,對外提供這些實現類。在提供的時候,根據靜態工廠方法的名字,提供不同的實現類。
這個的乙個體現就是Collection框架,你可以看下原始碼。
這樣寫,也會有缺點,導致不可被擴充套件。
具體的我部落格裡面有講這個,用靜態工廠方法替換構造器https://blog.csdn.net/youngyouth/article/details/80081295
2樓:
書我沒看過,就題主你貼出來的那段話來言,這不難理解。書裡既然提到了Collections這個工廠類,那我們就拿它來舉例吧。
比如我有個類叫SomeClass。這個類裡有乙個Set,存著一些property的名字。
為了給另乙個類訪問這些propertyNames,我得提供乙個方法,返回這個Set,然而我又不希望caller得到這個Set的引用以後亂改我的資料。乙個辦法就是呼叫Collections.unmodiableSet(),建立了乙個「不可修改的」副本:
public
class
SomeClass
public
Set<
String
>getPropertyNames()}
這個Collections.unmodifiableSet()就是乙個static factory method。我們依次來看:
1. 方法的返回型別是什麼?
public
static
T>unmodifiableSet
(Set
<?
extends
T>s)
簽名裡寫著,就返回乙個Set。
2. 方法的實現裡,它實際返回的型別是什麼?
是Set的乙個子類:UnmodifableSet。
3. UnmodifiableSet這個型別是公有的嗎?
不,它是作為Collections的乙個static nested class來定義的。也就是說,你自己不能呼叫它的建構函式來建立它。唯一能建立它的方法就是factory method。
4. 這麼做的好處是什麼?
作為呼叫者,我只需要知道propertyNames是乙個Set。因為我接下來要做的事情往往是遍歷它:
for(
Strings:
obj.
getPropertyNames
())作為乙個caller,我不必知道它的具體型別:UnmodifiableSet。只要是我不必知道的,它就不讓我知道。免得我心累。
而當我意圖修改這個Set時,它又會甩我乙個UnsupportedOperationException。豈不是很妙?