醬香之味

時間 2021-06-02 03:23:19

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

Set<

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。豈不是很妙?