工廠方法模式-(設計模式1)

什么是工廠方法模式?

要了解工廠方法模式先要了解其中的四種角色:

工廠抽象類G:抽象類,主要是定義生產(chǎn)產(chǎn)品類的接口。

工廠子類g:繼承工廠抽象類梅鹦,實現(xiàn)工廠抽象類的接口,實例化相對應的產(chǎn)品子類冗锁。

產(chǎn)品抽象類C:定義產(chǎn)品的基本屬性和方法齐唆。

產(chǎn)品子類:具體的產(chǎn)品類,工廠子類實例化的對象冻河。

官方解釋工廠方法模式:定義一個用于創(chuàng)建對象的接口(工廠抽象類)箍邮,讓子類(工廠子類)決定實例化哪些類(產(chǎn)品子類),使一個類(產(chǎn)品子類)的實例化延遲到子類(工廠子類)叨叙。

我的解釋:創(chuàng)建G(工廠抽象類),g(工廠子類),C(產(chǎn)品抽象類),c(產(chǎn)品子類)四個類锭弊,G定義一個生產(chǎn)產(chǎn)品的接口如createProduct,g繼承G,g實現(xiàn)createProduct,創(chuàng)建c并將c返回擂错,c繼承C味滞。這樣項目如果要修改c時只需要修改g中createProduct方法中實例化的對象。

工廠方法模式的優(yōu)缺點:

優(yōu)點:

1.將實例化產(chǎn)品類全部歸到一個接口钮呀,當要換產(chǎn)品類時剑鞍,只需要修改接口中實例化的類就行了,而項目中的其他地方不用變換爽醋。

2.刪除和增加是變得容易,符合開放封閉原則

缺點:

1.如要要增加產(chǎn)品類時解愤,也要對應的增加工廠類。

工廠方法模式的代碼實現(xiàn):

1.創(chuàng)建一個形狀基類PFAbstractShape乎莉。該類中定義了形狀的基本行為和屬性奸笤,如下代碼所示:

PFAbstractShape.h

#import <Foundation/Foundation.h>

#define PF_Exception_Format @"在%@的子類中必須override:%@方法"

@interfacePFAbstractShape :NSObject

@property(nonatomic,weak)NSString*name;

//子類必須重寫這個draw方法,否則會拋出異常錯誤

-(void)draw;

@end

PFAbstractShape.m

#import"PFAbstractShape.h"

@implementationPFAbstractShape

-(void)draw

{

//如果是通過PFAbstractShape的實例調用此處的draw哼鬓,則繪制一個PFAbstractShape圖形

if([selfisMemberOfClass:[PFAbstractShapeclass]]) {

NSLog(@"繪制一個PFAbstractShape圖形");

}else{

//如果是通過PFAbstractShape子類的實例調用了此處的draw监右,則拋出一個異常:表明子類并沒有重寫draw方法授药。

//注:在OC中并沒有abstract class的概念岔激,只有protocol,如果在基類中只定義接口(沒有具體方法的實現(xiàn))江兢,

//則可以使用protocol昨忆,這樣會更方便。

[NSExceptionraise:NSInternalInconsistencyException

format:PF_Exception_Format, [NSStringstringWithUTF8String:object_getClassName(self)],NSStringFromSelector(_cmd)];

}

}

在上面的代碼中定義了一個draw方法杉允,為了讓子類必須實現(xiàn)該方法邑贴,在PFAbstractShape中做了特殊處理席里,具體內容可以看上面的代碼,已經(jīng)有注視了拢驾。

2.子類化形狀基類奖磁。首先子類化一個圓形類:PFCircleShape。

PFCircleShape.h

#import"PFAbstractShape.h"

@interfacePFCircleShape :PFAbstractShape

@end

PFCircleShape.m

#import"PFCircleShape.h"

@implementationPFCircleShape

- (void)draw

{

NSLog(@"繪制一個PFCircleShape圖形");

}

@end

在上面的子類中繁疤,重寫了基類的draw方法咖为。同樣,我們再子類化一個正方形類稠腊,并重寫draw方法躁染,如下代碼所示:

PFSquareShape.h

#import"PFAbstractShape.h"

@interfacePFSquareShape :PFAbstractShape

@end

PFSquareShape.m

#import"PFSquareShape.h"

@implementationPFSquareShape

- (void)draw

{

NSLog(@"繪制一個PFSquareShape圖形");

}

@end

3.創(chuàng)建一個工廠方法的基類PFAbstractFactory

PFAbstractFactory.h

#import<Foundation/Foundation.h>

#import"PFAbstractShape.h"

@interfacePFAbstractFactory :NSObject

- (PFAbstractShape*)factoryMethod;

@end

PFAbstractFactory.m

#import"PFAbstractFactory.h"

@implementationPFAbstractFactory

-(PFAbstractShape*)factoryMethod

{

//在此處,子類必須重寫factoryMethod方法麻养。當然褐啡,在工廠模式中,也可以在此處返回一個默認的Product鳖昌。

//如果是通過PFAbstractFactory子類的實例調用了此處的factoryMethod备畦,則拋出一個異常:表明子類并沒有重寫factoryMethod方法。

[NSExceptionraise:NSInternalInconsistencyException

format:PF_Exception_Format, [NSStringstringWithUTF8String:object_getClassName(self)],NSStringFromSelector(_cmd)];

//下面這個return語句只是為了消除警告许昨,實際上永遠都不會執(zhí)行到這里懂盐。

returnnil;

}

@end

在上面的代碼中,定義了一個factoryMethod糕档,該類的子類必須實現(xiàn)該方法莉恼,通過實現(xiàn)該方法,返回一個具體的形狀對象速那。下面來看看該類的子類化俐银。

4.子類化工廠方法的基類。首先子類化一個圓形工廠方法PFCircleShapeFactory:

PFCircleShapeFactory.h

#import"PFAbstractFactory.h"

#import"PFCircleShape.h"

@interfacePFCircleShapeFactory :PFAbstractFactory

@end

PFCircleShapeFactory.m

#import"PFCircleShapeFactory.h"

@implementationPFCircleShapeFactory

- (PFAbstractShape*)factoryMethod

{

return[[PFCircleShapealloc]init];

}

@end

如上代碼所示端仰,重寫了factoryMethod捶惜,返回一個PFCircleShape實例。下面來看看另外一個子類PFSquareShapeFactory

PFSquareShapeFactory.h

#import"PFAbstractFactory.h"

#import"PFSquareShape.h"

@interfacePFSquareShapeFactory :PFAbstractFactory

@end

PFSquareShapeFactory.m

#import"PFSquareShapeFactory.h"

@implementationPFSquareShapeFactory

- (PFAbstractShape*)factoryMethod{

return[[PFSquareShapealloc]init];

}

@end

該子類返回的是一個PFSquareShape實例荔烧。

5.工廠方法的使用吱七。定義一個PFClient類,在該類中演示工廠方法的使用鹤竭。代碼如下:

PFClient.h

#import

@interfacePFClient :NSObject

- (void)doSomething;

@end

PFClient.m

#import"PFClient.h"

#import"PFAbstractFactory.h"

#import"PFCircleShapeFactory.h"

#import"PFSquareShapeFactory.h"

#import"PFAbstractShape.h"

#import"PFCircleShape.h"

#import"PFSquareShape.h"

@implementationPFClient

-(void)doSomething

{

//用到多態(tài)踊餐,父指針指向子對象,當要修改實例化的對象時臀稚,只需要修改工廠里的實例化對象

//工廠方法的實例化

PFAbstractFactory*circleShapefactory = [[PFCircleShapeFactoryalloc]init];

PFAbstractFactory*squareShapefactory = [[PFSquareShapeFactoryalloc]init];

//通過工廠方法實例化對應的形狀

PFAbstractShape*circleShape = [circleShapefactoryfactoryMethod];

PFAbstractShape*squareShape = [squareShapefactoryfactoryMethod];

//調用形狀的方法

[circleShapedraw];

[squareShapedraw];

}

@end

如上代碼所示吝岭,首先實例化兩個工廠方法,并通過工廠方法創(chuàng)建出對應的形狀,最后調用形狀的draw方法進行測試苍碟。會在控制臺窗口輸出如下內容:

2013-05-16 10:12:46.292 FactoryMethodPattern[2845:c07] 繪制一個PFCircleShape圖形

2013-05-16 10:12:46.295 FactoryMethodPattern[2845:c07] 繪制一個PFSquareShape圖形

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末酒觅,一起剝皮案震驚了整個濱河市撮执,隨后出現(xiàn)的幾起案子微峰,更是在濱河造成了極大的恐慌,老刑警劉巖抒钱,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜓肆,死亡現(xiàn)場離奇詭異,居然都是意外死亡谋币,警方通過查閱死者的電腦和手機仗扬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕾额,“玉大人早芭,你說我怎么就攤上這事∽绲” “怎么了退个?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長调炬。 經(jīng)常有香客問我语盈,道長,這世上最難降的妖魔是什么缰泡? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任刀荒,我火速辦了婚禮,結果婚禮上棘钞,老公的妹妹穿的比我還像新娘缠借。我一直安慰自己,他們只是感情好宜猜,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布泼返。 她就那樣靜靜地躺著姐扮,像睡著了一般况芒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上套硼,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天垫毙,我揣著相機與錄音霹疫,去河邊找鬼。 笑死综芥,一個胖子當著我的面吹牛丽蝎,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屠阻,長吁一口氣:“原來是場噩夢啊……” “哼红省!你這毒婦竟也來了?” 一聲冷哼從身側響起国觉,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吧恃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后麻诀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痕寓,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年蝇闭,在試婚紗的時候發(fā)現(xiàn)自己被綠了呻率。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡呻引,死狀恐怖礼仗,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情逻悠,我是刑警寧澤元践,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站蹂风,受9級特大地震影響卢厂,放射性物質發(fā)生泄漏。R本人自食惡果不足惜惠啄,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一慎恒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧撵渡,春花似錦融柬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至节腐,卻和暖如春外盯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背翼雀。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工饱苟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狼渊。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓箱熬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子城须,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蚤认,服務發(fā)現(xiàn),斷路器糕伐,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法砰琢,類相關的語法,內部類的語法赤炒,繼承相關的語法氯析,異常的語法,線程的語...
    子非魚_t_閱讀 31,630評論 18 399
  • 簡單工廠模式雖然簡單莺褒,但存在一個很嚴重的問題。當系統(tǒng)中需要引入新產(chǎn)品時雪情,由于靜態(tài)工廠方法通過所傳入?yún)?shù)的不同來創(chuàng)建...
    justCode_閱讀 1,185評論 1 9
  • 設計原則: 要依賴抽象遵岩,不要依賴具體類 目錄 本文的結構如下: 什么是工廠方法模式 為什么要用該模式 模式的結構 ...
    w1992wishes閱讀 1,344評論 0 6
  • 《歡樂頌》中安迪聰明睿智的職場形象尘执,很多人都喜歡。安迪宴凉,哥倫比亞大學商學院畢業(yè)誊锭,華爾街投行高管,回國后在上海朋友的...
    辰辰_Amy閱讀 1,300評論 4 50