由《大話設(shè)計模式 - 工廠模式》的OC和部分Swift的語言轉(zhuǎn)義
工廠模式
繼上一篇《代理模式》
- 工廠模式, 定義一個用于創(chuàng)建對象的接口, 讓子類決定實例化哪一個類但壮。 工廠方法使一個雷的實例化延遲到其子類咸包。 (反正 我第一眼是看懵逼了,往下看棒假, 就能慢慢體會了)
例子: 一個學(xué)生學(xué)雷鋒溯职,去敬老院幫助老人, 有一天這個學(xué)生病倒了帽哑, 但是這個學(xué)生前一天答應(yīng)王大爺谜酒,李阿姨,孫大伯妻枕,汪奶奶.... 要為他們做事情僻族。 此大無畏事跡,傳遍學(xué)校屡谐, 學(xué)生們紛紛表示述么,自己要代替這個學(xué)生去幫助老人。 (說的啥玩意愕掏, 你能懂么度秘?哎, 不多BB饵撑, 代碼說明一切剑梳。 哈哈哈)
OC
// 雷鋒
@interface LeiFeng : NSObject
- (void)helpOthers:(NSString *)str;
@end
@implementation LeiFeng
- (void)helpOthers:(NSString *)str {
NSLog(@"helpOthers %@", str);
}
@end
// 雷鋒工廠
@interface IFactory : NSObject
- (instancetype)createLeiFeng;
@end
@implementation IFactory
- (instancetype)createLeiFeng {return nil;}
@end
// 學(xué)雷鋒的大學(xué)生
@interface Undergraduate : LeiFeng
@end
@implementation Undergraduate
@end
// 學(xué)雷鋒的大學(xué)生工廠
@interface UndergraduateFactory : IFactory
@end
@implementation UndergraduateFactory
- (instancetype)createLeiFeng {
return (id)[Undergraduate new];
}
@end
// * 未來新增之后 方便用, 除修改主頁面的邏輯之外肄梨, 任何類都不需要動用 *//
// 志愿者 (任何角色)
@interface Volunteer : LeiFeng
@end
@implementation Volunteer
@end
// 社區(qū)志愿者工廠
@interface VolunteerFactory : IFactory
@end
@implementation VolunteerFactory
- (instancetype)createLeiFeng {
return (id)[Volunteer new];
}
@end
// 學(xué)習(xí)雷鋒的男孩兒
@interface Boy : LeiFeng
@end
@implementation Boy
@end
// 學(xué)習(xí)雷鋒的男孩工廠
@interface BoyFactory : IFactory
@end
@implementation BoyFactory
- (instancetype)createLeiFeng {
return (id)[Boy new];
}
@end
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 學(xué)生
IFactory *factory = [UndergraduateFactory new];
LeiFeng *student = (LeiFeng *)[factory createLeiFeng];
[student helpOthers:@"Joey"];
// 志愿者
VolunteerFactory *volunteerF = [VolunteerFactory new];
Volunteer *v1 = (Volunteer *)[volunteerF createLeiFeng];
[v1 helpOthers:@"小F"];
// boy
BoyFactory *bf = [BoyFactory new];
Boy *boy = (Boy *)[bf createLeiFeng];
[boy helpOthers:@"Boy"];
.......
}
@end
簡單工廠模式 VS. 工廠模式
簡單工廠模式的最大優(yōu)點在于工廠類中包含了必要的邏輯判斷阻荒, 根據(jù)客戶端的選擇條件動態(tài)實例化相關(guān)的類, 對于客戶端來說众羡,去除了具體產(chǎn)品的依賴
工廠方法模式是現(xiàn)實侨赡, 客戶端需要決定實例化哪一個工廠來實現(xiàn)運算類,選在判斷的問題還是存在的, 也就是說羊壹, 工廠方法吧簡單的工廠的內(nèi)部邏輯判斷移到了客戶端代碼來進(jìn)行蓖宦, 想要加功能, 搬來是修稿工廠類的油猫, 而現(xiàn)在修改的是客戶端
工廠模式 相比簡單工廠模式 更具有低耦合稠茂,可擴(kuò)展性強(qiáng)。工廠模式保持了簡單工廠模式的有點情妖,并且克服了它的缺點睬关, 但工廠模式的缺點是魷魚每增加一個產(chǎn)品, 就需要增加一個產(chǎn)品工廠的類毡证, 總價了額外的開發(fā)量