簡(jiǎn)單工廠忧侧、工廠方法、抽象工廠設(shè)計(jì)模式-iOS

這里介紹一下設(shè)計(jì)模式中的簡(jiǎn)單工廠模式牌芋、工廠方法模式蚓炬、抽象工廠模式在iOS中的實(shí)現(xiàn)。這三個(gè)設(shè)計(jì)模式是有演變關(guān)系的躺屁;在開(kāi)發(fā)中可以根據(jù)情況選擇肯夏。

一、簡(jiǎn)單工廠模式(Simple Factory Pattern)

它通常用于創(chuàng)建和返回與用戶(hù)輸入或配置相關(guān)的不同類(lèi)的對(duì)象。這種模式可以用于以下場(chǎng)景:
1)創(chuàng)建某些類(lèi)的對(duì)象時(shí)驯击,需要根據(jù)輸入?yún)?shù)或配置來(lái)確定使用哪個(gè)類(lèi)烁兰。
2)對(duì)象需要根據(jù)設(shè)置或所處場(chǎng)景不同而發(fā)生變化,但是調(diào)用方不關(guān)心對(duì)象是如何創(chuàng)建的徊都。

下面是一個(gè)具體例子:

不使用之前

假設(shè)目前的情況是:我們有兩個(gè)生產(chǎn)線:生產(chǎn)面包和生產(chǎn)蛋糕沪斟,它們的業(yè)務(wù)邏輯是不一樣的;現(xiàn)在要做到的是根據(jù)參數(shù)輸入來(lái)生產(chǎn)對(duì)應(yīng)的食物暇矫,并且不需要關(guān)心內(nèi)部是哪條生產(chǎn)線執(zhí)行主之,在不使用簡(jiǎn)單工廠設(shè)計(jì)模式時(shí),我們需要將方法抽取到不同的類(lèi)中去實(shí)現(xiàn)李根。

// 抽取的父類(lèi)
@interface Operation : NSObject
- (void)productFood;
@end
@implementation Operation
- (void)productFood{}
@end

// 生產(chǎn)蛋糕的類(lèi)
@interface OperationCake : Operation
@end
@implementation OperationCake
- (void)productFood{
    // do some things 執(zhí)行業(yè)務(wù)邏輯
    NSLog(@"蛋糕生產(chǎn)成功槽奕!");
}
@end
// 生產(chǎn)面包的類(lèi)代碼與蛋糕類(lèi)類(lèi)似

上面代碼我們可以看到,我們需要使用具體的類(lèi)OperationCake初始化后調(diào)用productFood方法完成房轿。這種設(shè)計(jì)的缺點(diǎn)是:使用時(shí)我們需要知道具體的生產(chǎn)線類(lèi)型史翘,如果生產(chǎn)線很多時(shí),使用變得困難冀续。

使用之后

簡(jiǎn)單工廠模式做法就是由一個(gè)工廠類(lèi)(Factory)來(lái)提供方法來(lái)創(chuàng)建實(shí)際的生產(chǎn)線對(duì)象琼讽,我們?cè)谑褂脮r(shí)面向這個(gè)工廠類(lèi)就可以了。

// 工廠類(lèi)
@implementation Factory
// 創(chuàng)建一條生產(chǎn)線
+ (Operation *)createOperation:(OperationType)type{
    switch (type) {
        case OperationTypeCake:
            return [[OperationCake alloc] init];
            break;
        case OperationTypeBread:
            return [[OperationBread alloc] init];
            break;
            
        default:
            break;
    }
}
@end

使用時(shí):

Operation *cakeMaker = [Factory createOperation:OperationTypeCake];
[cakeMaker productFood];

二洪唐、工廠方法模式(Factory Method Pattern)

簡(jiǎn)單工廠演變而來(lái)的钻蹬,在簡(jiǎn)單工廠模式中,當(dāng)需要增加新的類(lèi)型時(shí)凭需,需要修改工廠類(lèi)的代碼问欠,而這可能會(huì)破壞開(kāi)放-封閉原則.
工廠方法模式的做法是:將上面的創(chuàng)建流水線的的業(yè)務(wù)改為由對(duì)應(yīng)的工廠類(lèi)來(lái)實(shí)現(xiàn),這樣我們使用時(shí)粒蜈,直接使用對(duì)應(yīng)的工廠來(lái)創(chuàng)建屬于它的流水線顺献。這樣,在新增生產(chǎn)線時(shí)枯怖,新增一個(gè)繼承Factory的工廠類(lèi)即可注整。

//  工廠類(lèi)
@interface Factory : NSObject
// 創(chuàng)建一條生產(chǎn)線
+ (Operation *)createOperation;
@end

// 蛋糕工廠類(lèi)
@interface FactoryCake : Factory
@end
@implementation FactoryCake

+ (Operation *)createOperation{
    return [[OperationCake alloc] init];
}
@end

使用時(shí)

Operation *cakeMaker2 = [FactoryCake createOperation];
[cakeMaker2 productFood];

三、抽象工廠模式(Abstract Factory Pattern)

工廠方法模式演變而來(lái)度硝,在工廠方法模式中肿轨,工廠只負(fù)責(zé)創(chuàng)建一種類(lèi)型的對(duì)象。而抽象工廠模式則可以創(chuàng)建一組相關(guān)聯(lián)或相互依賴(lài)的對(duì)象蕊程,它首先需要?jiǎng)?chuàng)建一個(gè)抽象工廠椒袍,并定義一組工廠方法,每個(gè)方法用于創(chuàng)建一個(gè)相關(guān)的對(duì)象藻茂。
下面是一個(gè)音樂(lè)播放的例子驹暑,需要?jiǎng)?chuàng)建音樂(lè)播放器玫恳、音樂(lè)列表播放進(jìn)度; 但是要區(qū)分暗黑模式优俘、光亮模式纽窟。

protocol MusicFactory {
    func createMusicPlayer() -> MusicPlayer
    func createMusicList() -> MusicList
    func createMusicProgress() -> MusicProgress
}

// 暗黑風(fēng)格的一些對(duì)象
class DarkMusicFactory: MusicFactory {
    func createMusicPlayer() -> MusicPlayer {
        return DarkMusicPlayer()
    }

    func createMusicList() -> MusicList {
        return DarkMusicList()
    }

    func createMusicProgress() -> MusicProgress {
        return DarkMusicProgress()
    }
}

// 明亮風(fēng)格的一些對(duì)象
class BrightMusicFactory: MusicFactory {
    func createMusicPlayer() -> MusicPlayer {
        return BrightMusicPlayer()
    }

    func createMusicList() -> MusicList {
        return BrightMusicList()
    }

    func createMusicProgress() -> MusicProgress {
        return BrightMusicProgress()
    }
}

在使用時(shí):

let darkFactory = DarkMusicFactory()
let darkPlayer = darkFactory.createMusicPlayer()
let darkList = darkFactory.createMusicList()
let darkProgress = darkFactory.createMusicProgress()

let brightFactory = BrightMusicFactory()
let brightPlayer = brightFactory.createMusicPlayer()
let brightList = brightFactory.createMusicList()
let brightProgress = brightFactory.createMusicProgress()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市兼吓,隨后出現(xiàn)的幾起案子臂港,更是在濱河造成了極大的恐慌,老刑警劉巖视搏,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件审孽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡浑娜,警方通過(guò)查閱死者的電腦和手機(jī)佑力,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)筋遭,“玉大人打颤,你說(shuō)我怎么就攤上這事±焯希” “怎么了编饺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)响驴。 經(jīng)常有香客問(wèn)我透且,道長(zhǎng),這世上最難降的妖魔是什么豁鲤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任秽誊,我火速辦了婚禮,結(jié)果婚禮上琳骡,老公的妹妹穿的比我還像新娘锅论。我一直安慰自己,他們只是感情好楣号,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布最易。 她就那樣靜靜地躺著,像睡著了一般竖席。 火紅的嫁衣襯著肌膚如雪耘纱。 梳的紋絲不亂的頭發(fā)上敬肚,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天毕荐,我揣著相機(jī)與錄音,去河邊找鬼艳馒。 笑死憎亚,一個(gè)胖子當(dāng)著我的面吹牛员寇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播第美,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蝶锋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了什往?” 一聲冷哼從身側(cè)響起扳缕,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎别威,沒(méi)想到半個(gè)月后躯舔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡省古,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年粥庄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豺妓。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惜互,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出琳拭,到底是詐尸還是另有隱情训堆,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布白嘁,位于F島的核電站蔫慧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏权薯。R本人自食惡果不足惜姑躲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盟蚣。 院中可真熱鬧黍析,春花似錦、人聲如沸屎开。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奄抽。三九已至蔼两,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逞度,已是汗流浹背额划。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留档泽,地道東北人俊戳。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓揖赴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親抑胎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子燥滑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355