更新: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í)間更新