
目錄
- 官方用到的幾種設計模式
- 代理模式(Proxy)
- 觀察者模式(Observer)
- 單例模式(Singleton)
- 工廠模式(Factory)
- 策略模式(Strategy)
- 裝飾模式(Decorator)
- 適配器模式(Adapter)
- MVC及一些衍生設計模式
官方用到的幾種設計模式
官方的用法總是我們很關心、也是值得學習的
代理模式(Proxy Pattern)
當一個類的某些功能需要由別的類來實現(xiàn)、但是又不確定具體會是哪個類實現(xiàn)。
有兩個主體:委托者(方法調用者)、代理者(方法實現(xiàn)者)。
Cocoa下的應用:
UITableView、UIAlertView、NSURLSession等等
觀察者模式(Observer)
主要負責對象間的通訊。
觀察者注冊自己感興趣的事件、被觀察者不需要知道觀察者的存在。
-
通知
Cocoa下的應用:
鍵盤升降(UIKeyboardWillShowNotification、UIKeyboardWillHideNotification)、前后臺切換(name:UIApplicationDidEnterBackgroundNotification、UIApplicationDidBecomeActiveNotification)等等
-
KVO
具體應用:下載進度條、表單填寫狀態(tài)的更新。
不過實際上cocoa并沒有給我們暴露直接使用KVO的例子。
單例模式(Singleton)
主要用于共享資源、并且確保該實例只被初始化一次。
Cocoa下的應用:
[NSUserDefaults standardUserDefaults]、 [UIApplication sharedApplication]、[UIScreen mainScreen]、[NSFileManager defaultManager]等等。
工廠模式
專門定義一個類來負責創(chuàng)建其他類的實例、被創(chuàng)建的實例常常具有共同的父類(基于多態(tài))。
工廠模式分為三種:簡單工廠模式、工廠模式、抽象工廠模式。
-
簡單工廠模式
由一個工廠類、根據(jù)傳入的參數(shù)(
通常是枚舉)、動態(tài)的決定創(chuàng)建出哪一個產(chǎn)品類的實例。
適用于負責創(chuàng)建的對象比較少的情況下使用、簡單工廠的穩(wěn)定性和可擴展性會隨著數(shù)量的增加而下降。
需要以下三個元素:
1. 工廠(Factory)
角色接受客戶端的請求、通過請求負責創(chuàng)建相應的產(chǎn)品對象。
2. 抽象產(chǎn)品(Abstract Product)
工廠模式所創(chuàng)建對象的父類或是共同擁有的接口、可是抽象類或接口<也就是協(xié)議>。
3. 具體產(chǎn)品(ConcreteProduct)
工廠模式所創(chuàng)建的對象都是這個產(chǎn)品實例。
工廠實現(xiàn):
//AnimalHouse
+ (Animal *)animalWithType:(AnimalType)type {
Animal *animal = nil;
if (type == AnimalTypeDog) {//狗
animal = [[Dog alloc] init];
} else if (type == AnimalTypeCat) {
animal = [[Cat alloc] init];
} else if (type == AnimalTypeSheep) {
animal = [[Sheep alloc] init];
}
return animal;
}
使用起來:
Animal *dog = [AnimalHouse animalWithType:AnimalTypeDog];
[dog shout];
Animal *cat = [AnimalHouse animalWithType:AnimalTypeCat];
[cat shout];
Animal *sheep = [AnimalHouse animalWithType:AnimalTypeSheep];
[sheep shout];
需要注意的是、如果只是將參數(shù)賦值給產(chǎn)品(比如顏色等等)、是并不能算作簡單工廠模式的。
-
工廠模式(Factory)
相比簡單工廠、將《工廠》也進行抽象處理。
解決了簡單工廠模式下、臃腫的工廠導致增加產(chǎn)品時不宜擴展的弊端。
需要以下四個角色:
1. 抽象工廠
與業(yè)務方無關、任何在模式中創(chuàng)建對象的工廠必須實現(xiàn)這個接口。
2. 具體工廠
實現(xiàn)了抽象工廠接口的具體類、含有與引用密切相關的邏輯、并且受到業(yè)務方的調用以創(chuàng)建產(chǎn)品對象。
3. 抽象產(chǎn)品
工廠方法所創(chuàng)建產(chǎn)品對象的超類型,也就是產(chǎn)品對象的共同父類或共同擁有的接口。
4.具體產(chǎn)品
這個角色實現(xiàn)了抽象產(chǎn)品角色所聲名的接口。工廠方法所創(chuàng)建的每個具體產(chǎn)品對象都是某個具體產(chǎn)品角色的實例。
以其中一個工廠為例:
與抽象工廠AnimalHouse(動物之家)相比、具體工廠DogHouse(狗窩)隸屬于動物園。狗窩里自然全是狗~
//DogHouse
+ (Animal *)animal {
Animal *animal = [[Dog alloc] init];
return animal;
}
使用起來:
Animal *dog = [DogHouse animal];
[dog shout];
Animal *cat = [CatHouse animal];
[cat shout];
Animal *sheep = [SheepHouse animal];
[sheep shout];
雖然解決了擴展性。但依舊有個問題、就是當工廠太多、業(yè)務需要使用的工廠類型也太多了~
-
抽象工廠模式
與工廠模式的基本模式相同。最大的區(qū)別就是工廠實例不在只生產(chǎn)一種產(chǎn)品、而是生產(chǎn)一個產(chǎn)品族。
抽象工廠實現(xiàn):
//AnimalHouse
+ (AnimalHouse *)houseWithType:(AnimalType)type {
AnimalHouse *house = nil;
if (type == AnimalTypeDog) {//狗
house = [[DogHouse alloc] init];
} else if (type == AnimalTypeCat) {
house = [[CatHouse alloc] init];
} else if (type == AnimalTypeSheep) {
house = [[SheepHouse alloc] init];
}
return house;
}
具體使用:
//內部生成具體工廠`DogHouse `
// AnimalHouse *animalHouse = [AnimalHouse houseWithType:AnimalTypeDog];
//或者也可以直接使用具體工廠
AnimalHouse *animalHouse = [[DogHouse alloc] init];
//內部生成具體產(chǎn)品`MaleDog`
MaleAnimal* maleAnimal = [animalHouse maleAnimal];
//內部生成具體產(chǎn)品`femaleDog`
FemaleAnimal* femaleAnimal = [animalHouse femaleAnimal];
//使用該產(chǎn)品
[maleAnimal shout];
[femaleAnimal shout];
Cocoa下的應用:
Cocoa框架下使用的為抽象工廠模式、具體使用的對象為NSString、NSArray、NSDictionary(包括可變對象)以及NSNumber。
以數(shù)組為例:
id obj1 = [NSArray alloc];
id obj2 = [NSMutableArray alloc];
id obj3 = [obj1 init];
id obj4 = [obj2 init];
id obj5 = [UIView alloc];
id obj6 = [obj5 init];
NSLog(@"%@",NSStringFromClass([obj1 class]));
NSLog(@"%@",NSStringFromClass([obj2 class]));
NSLog(@"%@",NSStringFromClass([obj3 class]));
NSLog(@"%@",NSStringFromClass([obj4 class]));
NSLog(@"%@",NSStringFromClass([obj5 class]));
NSLog(@"%@",NSStringFromClass([obj6 class]));
打印結果:
__NSPlaceholderArray
__NSPlaceholderArray
__NSArray0
__NSArrayM
UIView
UIView
可見數(shù)組與View不同。alloc生成的對象并不是最終的《產(chǎn)品》、而是一個《工廠》。
而且是一個單例工廠:
NSArray * obj1 = [NSArray alloc];
NSArray * obj2 = [NSArray alloc];
NSMutableArray * obj3 = [NSMutableArray alloc];
NSMutableArray * obj4 = [NSMutableArray alloc];
NSLog(@"%p",obj1);
NSLog(@"%p",obj2);
NSLog(@"%p",obj3);
NSLog(@"%p",obj4);
輸出:
0x604000010360
0x604000010360
0x604000010350
0x604000010350
策略模式(Strategy)
策略模式其實和工廠模式類似、都是利用繼承(或者協(xié)議)的方式實現(xiàn)。
只是《工廠模式更像是對對象的管理》、而《策略模式是對行為的管理》。
舉個最常見的例子:AFNetworking下的AFHTTPRequestSerializer與AFJSONResponseSerializer、二者分別負責編碼與解碼的策略。
以解碼為例、你可以使用不同的策略:
AFJSONResponseSerializer、AFXMLParserResponseSerializer、AFXMLDocumentResponseSerializer等等。將服務器返回的數(shù)據(jù)解析成不同的結果。
在Cocoa下的應用:
數(shù)組排序的:sortedArrayUsingSelector方法。
他會依居數(shù)組內部不同元素、采用不用元素的排序策略。
裝飾模式(Decorator)
是在不改變原封裝的前提下,為對象動態(tài)添加新功能的模式
主要通過Extension和Category來實現(xiàn)
在Cocoa下的應用:
最常用的例子就是NSObject的performSelector方法集
NSObject (NSThreadPerformAdditions):
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg;
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
@interface NSObject (NSDelayedPerforming):
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray<NSRunLoopMode> *)modes;
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
適配器模式(Adapter)
將一個類的接口轉化為另一個類的接口、使得原本互不兼容的類可以通過接口一起工作
從某些意義上來講、某些情況下的代理模式也算適配器模式。
委托者通過代理(適配器)要求代理者提供合適的資源。
適配器分為:
- 類適配器
以(多)繼承的方式實現(xiàn)、被適配類的子類通過多繼承的方式進行格式化輸出。 - 對象適配器
存在一個適配器對象、用來將被適配對象進行格式化輸出。
實現(xiàn)一個適配器、我們至少需要以下三個對象:
1. 被適配者(Adoptee)
通常為舊模塊
2. 適配目標(Target)
通常為協(xié)議接口
3. 適配器(Adopter)
類適配器為Adoptee的子類、對象適配器為持有Adoptee的第三者。
4. 用戶(Client)
最終信息的接受者

在Cocoa下的應用:
UITableView(Client)作為向UIViewController(Adopter)尋求格式為UITableViewDataSource(Target)的資源。
而UIViewController(Adopter)、則通過對自身持有的數(shù)據(jù)源NSArray(Adoptee)進行格式化處理后、交付給UITableViewDataSource(Target)。
Demo的話可以看看《適配器模式的解析-iOS》或者《IOS設計模式淺析之適配器模式(Adapter)》
MVC及一些衍生設計模式
iOS架構補完計劃--淺談MVC及其衍生架構模式(附簡易圖解)
最后
本文主要是自己的學習與總結。如果文內存在紕漏、萬望留言斧正。如果不吝賜教小弟更加感謝。
參考資料
IOS設計模式淺析之簡單工廠模式(SimpleFactory)
iOS 三種工廠模式(簡單工廠模式、工廠模式、抽象工廠模式)
iOS設計模式之美-抽象工廠模式
【iOS開發(fā)】類簇--抽象工廠模式在OC中的使用
iOS策略設計模式
適配器模式的解析-iOS
IOS設計模式淺析之適配器模式(Adapter)
iOS架構師_適配器模式