iOS 簡(jiǎn)單工廠模式

更新:2017.05.24

一、基礎(chǔ)(多態(tài))

1.什么是多態(tài)

  • 本質(zhì)是父類(lèi)指針指向子類(lèi)指針命爬;
  • 面向?qū)ο笕筇匦灾唬?/li>
  • 同一操作作用于不同的對(duì)象笔宿,可以有不同的解釋?zhuān)a(chǎn)生不同的執(zhí)行結(jié)果律姨;

2.OC中的多態(tài)

這里舉一個(gè)例子來(lái)介紹一下OC中的多態(tài):使用一個(gè)父類(lèi)Animal米苹,動(dòng)態(tài)新建相應(yīng)的子類(lèi)Dog、Cat和Sheep


創(chuàng)建一個(gè)Animal類(lèi)

---------- AnimalModel.h ----------
#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, AnimalType) {
    AnimalTypeDog,//狗
    AnimalTypeCat,//貓
    AnimalTypeSheep,//羊
};

@interface AnimalModel : NSObject

//構(gòu)造器 類(lèi)初始化(根據(jù)不同的枚舉類(lèi)型初始化不同的動(dòng)物)
+ (AnimalModel *)initWithType:(AnimalType)type;

//動(dòng)物叫
- (void)shout;

@end

---------- AnimalModel.m ----------
#import "AnimalModel.h"
#import "DogModel.h"
#import "CatModel.h"
#import "SheepModel.h"

@implementation AnimalModel

+ (AnimalModel *)initWithType:(AnimalType)type {
    AnimalModel *model = nil;
    if (type == AnimalTypeDog) {//狗
        model = [[DogModel alloc] init];
    } else if (type == AnimalTypeCat) {
        model = [[CatModel alloc] init];
    } else if (type == AnimalTypeSheep) {
        model = [[SheepModel alloc] init];
    }
    return model;
}

- (void)shout {
    NSLog(@"動(dòng)物叫");
}

@end

新建Dog類(lèi)忍啸,繼承自Animal

---------- DogModel.h ----------
#import "AnimalModel.h"

@interface DogModel : AnimalModel

@end

---------- DogModel.m ----------
#import "DogModel.h"

@implementation DogModel

- (void)shout {
    NSLog(@"汪");
}

@end

新建Cat類(lèi)仰坦,繼承自Animal

---------- CatModel.h ----------
#import "AnimalModel.h"

@interface CatModel : AnimalModel

@end

---------- CatModel.m ----------
#import "CatModel.h"

@implementation CatModel

- (void)shout {
    NSLog(@"喵");
}

@end

新建Sheep類(lèi),繼承自Animal

---------- SheepModel.h ----------
#import "AnimalModel.h"

@interface SheepModel : AnimalModel

@end

---------- SheepModel.m ----------
#import "SheepModel.h"

@implementation SheepModel

- (void)shout {
    NSLog(@"咩");
}

@end

在ViewController中進(jìn)行使用

#import "ViewController.h"
#import "AnimalModel.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    AnimalModel *dog = [AnimalModel initWithType:AnimalTypeDog];
    [dog shout];
    AnimalModel *cat = [AnimalModel initWithType:AnimalTypeCat];
    [cat shout];
    AnimalModel *sheep = [AnimalModel initWithType:AnimalTypeSheep];
    [sheep shout];
}

@end

得到的打印值為

2017-05-24 16:35:18.333 Demo_GaoQiang[8211:3992590] 汪
2017-05-24 16:35:18.334 Demo_GaoQiang[8211:3992590] 喵
2017-05-24 16:35:18.334 Demo_GaoQiang[8211:3992590] 咩

結(jié)論
ViewController中并沒(méi)有import Dog计雌、Cat或者Sheep(抽象子類(lèi))悄晃,它們本身的對(duì)象是通過(guò)它們的父類(lèi)Animal(抽象類(lèi))初始化完成,在程序運(yùn)行時(shí)才會(huì)確定對(duì)象的實(shí)際類(lèi)型凿滤。 在父類(lèi)(抽象類(lèi))指針指向不同的對(duì)象的時(shí)候妈橄,通過(guò)父類(lèi)指針調(diào)用被重寫(xiě)的方法,會(huì)執(zhí)行該指針?biāo)赶虻哪莻€(gè)對(duì)象(抽象子類(lèi))的方法翁脆。這就是OC中的多態(tài)眷蚓。

二、簡(jiǎn)單工廠介紹

1.多態(tài)和簡(jiǎn)單工廠方法的關(guān)系

第一節(jié)介紹了多態(tài)反番,因?yàn)楹?jiǎn)單工廠模式本質(zhì)上就是基于多態(tài)的實(shí)現(xiàn):簡(jiǎn)單工廠實(shí)際上就是在抽象類(lèi)和抽象子類(lèi)的兩者關(guān)系中加入了一個(gè)第三者——工廠類(lèi)Factory沙热,這個(gè)Factory將原本在抽象類(lèi)(父類(lèi))中的接口、構(gòu)造器方法寫(xiě)在了自己內(nèi)部恬口,從而將抽象類(lèi)和抽象子類(lèi)之間的耦合度降低校读,在需求的更改后,只需要對(duì)工廠類(lèi)進(jìn)行修改就可以祖能。

2.實(shí)現(xiàn)條件

  • 存在繼承關(guān)系
  • 運(yùn)用多態(tài)的特性

3.優(yōu)點(diǎn)

  • 比較適合一些簡(jiǎn)單的、Model中存在大量繼承情況的項(xiàng)目
  • 在一定程度上優(yōu)化了代碼蛾洛,提高了代碼的復(fù)用性
  • 將大量的操作放到工廠類(lèi)中去處理养铸,業(yè)務(wù)類(lèi)中只負(fù)責(zé)創(chuàng)建需要的對(duì)象雁芙,降低了對(duì)象初始化和業(yè)務(wù)類(lèi)之間邏輯的耦合

4.缺點(diǎn)

  • 必須基于繼承關(guān)系
  • 工廠類(lèi)中集中了大量的創(chuàng)建邏輯,但是當(dāng)所有的子類(lèi)(抽象子類(lèi))不是繼承自同一個(gè)父類(lèi)(抽象類(lèi))時(shí)钞螟,它的擴(kuò)展比較困難

三兔甘、簡(jiǎn)單工廠模式的實(shí)現(xiàn)

基于第一節(jié)的代碼,將AnimalModel中的構(gòu)造器方法取出鳞滨,放入新建的工廠類(lèi)AnimalFactory中(這里只展示有修改的代碼洞焙,沒(méi)有修改的代碼和原來(lái)一樣)

---------- AnimalModel.h ----------
#import <Foundation/Foundation.h>

@interface AnimalModel : NSObject

//動(dòng)物叫
- (void)shout;

@end

---------- AnimalModel.m ----------
#import "AnimalModel.h"

@implementation AnimalModel

- (void)shout {
    NSLog(@"動(dòng)物叫");
}

@end

新建一個(gè)AnimalFactory類(lèi)

---------- AnimalFactory.h ----------
#import <Foundation/Foundation.h>
@class AnimalModel;

typedef NS_ENUM(NSInteger, AnimalType) {
    AnimalTypeDog,//狗
    AnimalTypeCat,//貓
    AnimalTypeSheep,//羊
};

@interface AnimalFactory : NSObject

//構(gòu)造器 類(lèi)初始化(根據(jù)不同的枚舉類(lèi)型初始化不同的動(dòng)物)
+ (AnimalModel *)initWithType:(AnimalType)type;

@end

---------- AnimalFactory.m ----------
#import "AnimalFactory.h"
#import "AnimalModel.h"
#import "DogModel.h"
#import "CatModel.h"
#import "SheepModel.h"

@implementation AnimalFactory

+ (AnimalModel *)initWithType:(AnimalType)type {
    AnimalModel *model = nil;
    if (type == AnimalTypeDog) {//狗
        model = [[DogModel alloc] init];
    } else if (type == AnimalTypeCat) {
        model = [[CatModel alloc] init];
    } else if (type == AnimalTypeSheep) {
        model = [[SheepModel alloc] init];
    }
    return model;
}

@end

在ViewController中進(jìn)行使用

#import "ViewController.h"
#import "AnimalModel.h"
#import "AnimalFactory.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    AnimalModel *dog = [AnimalFactory initWithType:AnimalTypeDog];
    [dog shout];
    AnimalModel *cat = [AnimalFactory initWithType:AnimalTypeCat];
    [cat shout];
    AnimalModel *sheep = [AnimalFactory initWithType:AnimalTypeSheep];
    [sheep shout];
}

@end

得到的打印值為

2017-05-24 17:17:34.646 Demo_GaoQiang[8337:4159039] 汪
2017-05-24 17:17:34.646 Demo_GaoQiang[8337:4159039] 喵
2017-05-24 17:17:34.646 Demo_GaoQiang[8337:4159039] 咩

結(jié)論
注意對(duì)比簡(jiǎn)單工廠模式的實(shí)現(xiàn)和多態(tài)的實(shí)現(xiàn),兩者的區(qū)別其實(shí)僅僅只是一個(gè)工廠類(lèi)Factory而已

以上就是簡(jiǎn)單工廠模式拯啦,想到其他的再更新吧澡匪,有什么理解不對(duì)的或者寫(xiě)錯(cuò)的地方,歡迎大家指出褒链,我將在第一時(shí)間更新

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唁情,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子甫匹,更是在濱河造成了極大的恐慌甸鸟,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兵迅,死亡現(xiàn)場(chǎng)離奇詭異抢韭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)恍箭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)刻恭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人季惯,你說(shuō)我怎么就攤上這事吠各。” “怎么了勉抓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵贾漏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我藕筋,道長(zhǎng)纵散,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任隐圾,我火速辦了婚禮伍掀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘暇藏。我一直安慰自己蜜笤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布盐碱。 她就那樣靜靜地躺著把兔,像睡著了一般沪伙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上县好,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天围橡,我揣著相機(jī)與錄音,去河邊找鬼缕贡。 笑死翁授,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晾咪。 我是一名探鬼主播收擦,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼禀酱!你這毒婦竟也來(lái)了炬守?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤剂跟,失蹤者是張志新(化名)和其女友劉穎减途,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體曹洽,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鳍置,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了送淆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片税产。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖偷崩,靈堂內(nèi)的尸體忽然破棺而出辟拷,到底是詐尸還是另有隱情,我是刑警寧澤阐斜,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布衫冻,位于F島的核電站,受9級(jí)特大地震影響谒出,放射性物質(zhì)發(fā)生泄漏隅俘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一笤喳、第九天 我趴在偏房一處隱蔽的房頂上張望为居。 院中可真熱鬧,春花似錦杀狡、人聲如沸蒙畴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)忍抽。三九已至八孝,卻和暖如春董朝,著一層夾襖步出監(jiān)牢的瞬間鸠项,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工子姜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祟绊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓哥捕,卻偏偏與公主長(zhǎng)得像牧抽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子遥赚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容