2011-09-24 84 views
3

好像我看到了很多的目標C類的方法是像+(NSString*)stringWithString:(NSString *)string+(NSArray)arrayWithArray:(NSArray *)array,等我剛開始考慮設計模式,對我這些方法看起來像生產基於字符串或數組的特定實現小工廠所提供的PARAMATERS(stringWith ,串ByAppendingString)。從本質上講,這看起來很像工廠方法,其參數在設計模式中有演示。有一個更好的方法嗎?我應該創建混合這些類方法和實例方法的接口,還是創建沒有任何實例方法的Factory Only對象?我很困惑。類方法是Objective-C實現工廠方法的最佳方式嗎?

回答

4

雖然Apple claims這些方法都是工廠方法,但我認爲它們與設計模式中的工廠方法模式不一樣。 DP工廠方法模式使用抽象Creator類,其中具體的子類生成具體的Product類。您所描述的方法(通常稱爲「便利構造函數」)幾乎從未以這種方式實現。 Apple對工廠方法的定義是「一種類方法,爲了方便客戶,它創建了一個類的實例。工廠方法將分配和初始化一步合併,並返回類的自動釋放實例。」這就是爲什麼我相信「便利構造」這個術語更合適,並且不會讓「工廠方法」混淆。

NSStringclass cluster,它與Factory Method模式有一些相似之處,因爲您可以從同一個方法調用中接收不同的具體類。但是類類與Factory Method不同,因爲超類知道所有的子類,它是調用者與之交互的超類。在工廠方法模式中,調用者與Creator類的子類進行交互。

所以你的問題:你應該建立方便的方法在方便的時候給調用者。它補充:

Foo *foo = [[[Foo alloc] initWithSomething:something] autorelease]; 

Foo *foo = [Foo fooWithSomething:something]; 

我的經驗,這些建築是90%的時候,你不應該。這不值得額外的代碼。你應該等到你看到initWithSomething:被稱爲很多用後馬上一個autorelease,然後添加一個便捷構造使事情變得更加方便。諸如stringWith...之類的東西都在這個類中。他們被稱爲很多。

+0

我認爲這是我的困惑來自蘋果。我必須在他們稱之爲工廠方法的某個地方閱讀過這個頁面。它們實際上只是自動釋放對象的簡寫。這是有道理的...所以如果我想實現實際的* DP *工廠方法模式,我需要繼續並創建一個常規的舊界面,我答應我自己不要實現......在Obj-C中沒有抽象的名稱...? –

+0

抽象接口的近似等價物是@protocol。但是,無法創建半抽象類,就像在編譯器強制執行的C++中一樣。當我這樣做時,我通常在抽象方法中調用'NSAssert'來注意它是抽象的。 –

0

根據定義,一個工廠方法必須是一個類的方法,因爲你需要的類來生成一個新的實例。 Apple的框架使用混合的工廠方法(例如arrayWithObjects)和非工廠初始化(initWithObjects)。

除此之外,我不確定我是否理解你的問題。對於大多數不平凡的類,您將擁有類工廠方法和實例初始化方法。

+1

他被設計模式弄糊塗了,這是一個概念,它比我見過的任何其他代碼都更加糟糕。 –

+0

@DanielRHicks你在說Factory Method模式負責很多錯誤的代碼?我很少看到實際的工廠方法模式。你的意思是抽象工廠模式?我曾經看到過有時使用不當的人。或者你的意思是某種其他工廠模式不是真正的* DP *模式?或者你的意思是「模式」的概念是否對壞代碼負責? –

+0

好吧,使用工廠方法沒有任何問題。這是設計模式和相關方案(以及它們對「模式」的機械映射)中的「分析」技術,這些技術導致不合邏輯的結構化應用程序,導致大量不必要的模塊和接口以及缺乏正確的「乾淨」接口。 –

0

這些方法通常作爲便利方法在文檔中描述 - 編寫[NSString stringWithString:s]只是比編寫[[[NSString alloc] initWithString:s] autorelease]短,但他們做同樣的事情。

關於工廠的角度,我覺得你是否把這些方法作爲一種工廠是一個品味的問題,並且取決於工廠的確切定義是什麼。

0

Objective-C中的類也是對象(類對象),工廠類設計模式是該語言的一部分。