iOS設(shè)計模式之美-抽象工廠模式

McDonald's.jpeg

iOS設(shè)計模式之美-工廠模式
iOS設(shè)計模式之美-抽象工廠模式
iOS設(shè)計模式之美-生成器模式
iOS設(shè)計模式之美-適配器模式

1.何為抽象工廠模式

抽象工廠模式為工廠模式的更細(xì)化區(qū)分。抽象工廠模式提供一個創(chuàng)建一系列相關(guān)或者相互依賴的對象接口,而無需指定它們的具體類。從上一篇文章iOS設(shè)計模式之美-工廠模式我們可知,工廠模式每種不同的產(chǎn)品都由不同的工廠負(fù)責(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)圖

UML.png

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)品

以上為本人個人理解與分享,如有錯誤歡迎指出??


fun.jpeg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容