iOS設(shè)計模式之美-工廠模式
iOS設(shè)計模式之美-抽象工廠模式
iOS設(shè)計模式之美-生成器模式
iOS設(shè)計模式之美-適配器模式
1.何為抽象工廠模式
抽象工廠模式為工廠模式的更細化區(qū)分没咙。抽象工廠模式提供一個創(chuàng)建一系列相關(guān)或者相互依賴的對象接口,而無需指定它們的具體類。從上一篇文章iOS設(shè)計模式之美-工廠模式我們可知返劲,工廠模式每種不同的產(chǎn)品都由不同的工廠負責(zé)生產(chǎn)。而抽象工廠模式則是一種工廠生產(chǎn)一系列相關(guān)的產(chǎn)品(產(chǎn)品族)
產(chǎn)品族:以產(chǎn)品平臺為基礎(chǔ),通過添加不同的個性模塊,以滿足不同客戶個性化需求的一組相關(guān)產(chǎn)品姐叁。
2.何時使用抽象工廠模式
- 批量調(diào)整一系列具有相同行為對象
例如:
套餐類型 | 漢堡 | 派 | 飲料 |
---|---|---|---|
A套餐 | 雙層吉士漢堡 | 蘋果派 | 可樂 |
B套餐 | 板燒雞腿漢堡 | 菠蘿派 | 雪碧 |
麥當(dāng)勞同時提供了兩種不同風(fēng)味的優(yōu)惠套餐供客戶選擇。滿足于同時想吃漢堡洗显、派和喝飲料的客戶外潜。長期選擇A套餐的客戶可能在某天想換換口味,這時他就會去嘗試另外一種B套餐挠唆。盡管套餐變了处窥,但是對于客戶的基礎(chǔ)要求仍舊可以滿足(漢堡、派玄组、飲料)滔驾。在基礎(chǔ)需求上又為不同客戶提供了更加個性化的選擇正是抽象工廠模式的強大之處。
3.抽象工廠模式靜態(tài)類結(jié)構(gòu)圖
4.案例
簡單的貼下上述套餐選擇的代碼(以A套餐為例俄讹,B套餐代碼同理):
WCQFactory.h
#import <Foundation/Foundation.h>
@class WCQHamburger, WCQPie, WCQDrink;
@interface WCQFactory : NSObject
- (WCQHamburger *)hamburger;
- (WCQPie *)pie;
- (WCQDrink *)drink;
@end
WCQFactory.m
#import "WCQFactory.h"
@implementation WCQFactory
- (WCQHamburger *)hamburger {
return nil;
}
- (WCQPie *)pie {
return nil;
}
- (WCQDrink *)drink {
return nil;
}
@end
WCQAFactory.m
#import "WCQAFactory.h"
#import "WCQCheeseHambueger.h"
#import "WCQCocaDrink.h"
#import "WCQApplePie.h"
@implementation WCQAFactory
- (WCQHamburger *)hamburger {
return [[WCQCheeseHambueger alloc] init];
}
- (WCQPie *)pie {
return [[WCQApplePie alloc] init];
}
- (WCQDrink *)drink {
return [[WCQCocaDrink alloc] init];
}
@end
WCQPie.h
#import <Foundation/Foundation.h>
@interface WCQPie : NSObject
- (void)beEaten;
@end
WCQPie.m
#import "WCQPie.h"
@implementation WCQPie
- (void)beEaten {
}
@end
WCQApplePie.m
#import "WCQApplePie.h"
@implementation WCQApplePie
- (void)beEaten {
NSLog(@"%s", __FUNCTION__);
}
@end
漢堡與飲料的代碼與派同理這里也不貼了...
調(diào)用方式:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
WCQFactory *factory = [[WCQAFactory alloc] init];
WCQHamburger *hamburger = [factory hamburger];
WCQPie *pie = [factory pie];
WCQDrink *drink = [factory drink];
[hamburger beEaten];
[pie beEaten];
[drink beDrink];
}
此時如果我需要替換成B套餐則只需要將WCQAFactory
替換成WCQBFactory
的具體工廠類即可哆致,而無需調(diào)整其他客戶端邏輯
5.工廠模式與抽象工廠的區(qū)別
抽象工廠 | 工廠模式 |
---|---|
通過對象組合創(chuàng)建抽象產(chǎn)品 | 通過類繼承創(chuàng)建抽象產(chǎn)品 |
創(chuàng)建多種產(chǎn)品 | 創(chuàng)建一種產(chǎn)品 |
必須修改抽象工廠接口才能支持新產(chǎn)品,并且會對所有子類工廠造成影響 | 子類化工廠并重載工廠方法即可創(chuàng)建新產(chǎn)品 |
以上為本人個人理解與分享患膛,如有錯誤歡迎指出??