2014-02-20 22 views
3

我一直在網上搜索想了解的方法是什麼工廠,但我還沒有找到任何簡單的例子,顯示了一個具體的例子中使用的工廠方法。我簡要地談過他們的一本書,但它沒有顯示一個例子,也沒有解釋它們是什麼「類方法通常被用作工廠方法」。什麼是語法和Objective-C的

1什麼是Objective-C的工廠方法的語法和使用?This是我發現的最接近的答案,但是當我在answar的評論中嘗試過示例時,我收到一條消息,說我無法調用super。在這個問題中,我更關注工廠方法實現的語法。

2-工廠方法在其他語言中稱爲構造函數嗎?

3-如何工廠方法相比,單身?

從蘋果文檔:

They combine allocation and initialization in one step and return the created object

是不是單身呢?

在下面的單例子中,我們可以說,類方法sharedData是一個工廠方法?

.m文件

#import "SingletonModel.h" 
@implementation SingletonModel 
static SingletonModel *sharedData; 

- (id) init { 
    if (self = [super init]) { 
     // custom initialization 
    } 
    return self; 
} 

// is this a factory method? 
+(SingletonModel*) sharedData 
{ 
    if (!sharedData) { 
     sharedData = [[SingletonModel alloc]init]; 
    } 
    return sharedData; 
} 
@end 
+1

http://stackoverflow.com/questions/14092222/class-factory-methods-implementation引用此 – Sport

回答

4

What is the syntax and use of a factory method in Objective-C

如果我們把UIColor爲例,工廠方法將+ (UIColor *)blackColor+ (UIColor *)clearColor ...

從您引用的其他問題,任何init...方法應該是實例方法(- (...),而不是+ (...))。在那個答案中,它是一個類方法,它不應該是。

Are factory methods what are called constructors in other languages

它們都具有相同的目的。並非所有的語言都區分內存分配和內存初始化。

How are factory methods compared to Singletons

單例通常提供單一方法來返回類的單個實例。它不是嚴格的工廠方法,因爲它不會在每次被調用時創建不同的實例,但它是同一類事物。

+0

你是說,在問題我引用的語法看起來很好,除了第一類方法需要是一個實例方法嗎?非常感謝你的幫助。 –

+1

是的,基本上。 – Wain

0

設計模式可以幫助您解決行之有效的解決方案複雜的編碼問題和A工廠提供了一個創作的一個點或一組對象。它還有助於不代碼到一個具體的類good example and syntax

1

工廠方法是讓所有的共同創作了一個對象,並將其返還給您的方法。
例如:你想要一個方法的UIColor,但是你希望你的方法在iOS和MacOS中交叉平臺。在這種情況下,對於MacOS,您需要使用此方法來返回NSColor,而對於iOS,您需要使用UIColor。所以最好的做法是使用Factory方法根據您的平臺向您返回不同的對象。

(id)colorWithType:(ColorType)type 
{ 
    id color; 
    switch(type) { 
     case type1: 
     // create the colour for type1 
     break; 
    case type2: 
     // create the colour for type2 
     break; 

    // now check the platform 
    if([self isCurrentPlatformMacOS]){ 
     // convert color to NSColor 
    } else { 
     // convert color to UIColor 
    } 
    return color; 
    } 
} 

看這個視頻,它會使它更容易理解。
http://www.youtube.com/watch?v=AsfM6YLtu9g (轉到3:00時)

5

人們可以使用不同的事情同一個術語。通常通過調用

MyClass* object = [[MyClass alloc] initWithParameters... ]; 

創建一個對象,你知道你得到的MyClass類的一個對象(不目標C相當真實的,但大多數情況下)。現在讓我們說一下MyClass的幾個子類。作爲調用者,你不知道也不關心這些子類。如果對象是類MySubClass,你不會知道也不會在意。但MyClass的實施者關心。他或她創建了更適合不同目的的子類。於是,他創建了一個工廠方法,你這樣稱呼它:

MyClass* object = [MyClass objectForParameters:... ]; 

類方法objectForParameters看參數,並決定樣的對象要返回的。該代碼可能看起來像

if (...) 
    return [[MySubClass1 alloc] initWithParameters:...]; 
else if (...) 
    return [[MySubClass2 alloc] initWithParameters:...]; 
else 
    return [[MySubClass3 alloc] initWithParameters:...]; 

你不知道你會得到什麼樣的對象,但你知道,你可以把它當作如果它屬於MyClass類。這種方法通常被稱爲「工廠方法」。這是一個爲你製造物品的工廠。 決定你得到哪種物體,而不是你。

+0

如果我在這個例子中正確理解了這個,你基本上有MyClass作爲基類,然後是從MyClass類繼承的3個其他類(MySubClass1,MySubClass2和MySubClass3),然後是第四個,一個FactoryClass,它#import另一個4類,那麼在FactoryClass中可能有一個工廠類方法,它基於參數決定哪個類需要返回哪個實例,我是否正確?如果我是正確的,這是如何創建Apple的String工廠方法?+ string + stringWithFormat:+ stringWithContentsOfFile:encoding:error: –

+0

我認爲你已經閱讀了太多關於編程模式的書。在這個例子中你看到任何工廠類嗎?你能想到一個實驗班有什麼好處嗎?工廠類方法的任何好處?你只是過分複雜的事情。 – gnasher729

+0

@ gnasher729這真的很有用。你能發佈一個示例鏈接或其他? – MixCoded