這里介紹一下設(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()