下面來聊聊設(shè)計模式中的工廠模式厚棵,它又分為(工廠方法,簡單工廠蔼紧,抽象工廠)婆硬,那么這3種又有什么區(qū)別呢,來奸例,聊個5毛錢的彬犯。工廠模式是利用了面向?qū)ο?大特性之一——多態(tài)向楼,父類指針指向子類對象這個特性。父類定義方法谐区,子類實(shí)現(xiàn)湖蜕。
一、工廠方法
第三方集成是iOS必備的一個技能吧宋列,比如說昭抒,支付,地圖炼杖。我們就拿地圖說事吧灭返,集成了百度地圖,后面要改成高德地圖嘹叫。一般為了方便就把代碼耦合在項(xiàng)目中了婆殿,雖然說代碼量是很少,維護(hù)起來是很方便罩扇,但是我們要學(xué)的是思想婆芦。像下面這種把一些初始化方法放在didFinishLaunchingWithOptions中,第三方集成多了顯得臃腫喂饥,代碼難看消约。
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
_mapManager = [[BMKMapManager alloc]init];
[_mapManager start:@"在此處輸入您的授權(quán)Key" generalDelegate:nil];
return YES;
}
1>分析,發(fā)現(xiàn)百度地圖BMKMapView是繼承的UIView员帮,高德地圖MAMapView也是繼承了UIView或粮,是不是可以做文章了?捞高?氯材?
@interface BMKMapView : UIView
@interface MAMapView : UIView
接下來就用工廠方法來處理地圖,一行代碼切換地圖硝岗。首先我們先定義一個父類IMapFactory氢哮,定義其方法。
.h文件
#import <UIKit/UIKit.h>
@interface IMapFactory : UIView
- (id)getMapFactoryWithFrame:(CGRect)frame;
@end
.m文件
#import "IMapFactory.h"
@implementation IMapFactory
- (id)getMapFactoryWithFrame:(CGRect)frame {
return nil;
}
@end
2>創(chuàng)建兩個子類BaiduMapFactory和GaodeMapFactory繼承IMapFactory型檀,在子類中實(shí)現(xiàn)其父類的方法冗尤。
- (id)getMapFactoryWithFrame:(CGRect)frame {
_mapManager = [[BMKMapManager alloc] init];
[_mapManager start:@"HBnGpGicUfd6SwSr5oCMre3asI29U0GG" generalDelegate:nil];
_mapView = [[BMKMapView alloc] initWithFrame:frame];
return _mapView;
}
這里可以將百度地圖的初始化代碼寫在這里,瘦身didFinishLaunchingWithOptions這個程序入口胀溺,程序設(shè)計有一個很好的原則裂七,我需要用你,你內(nèi)部怎么定義的我不管仓坞,我只管用背零。高德地圖也是一樣實(shí)現(xiàn)父類的方法。
3>接下來終于要用到了地圖這個功能了无埃。
IMapFactory *mapFactory = [[BaiduMapFactory alloc] getMapFactoryWithFrame:self.view.bounds];
[self.view addSubview:mapFactory];
你沒有看錯2行代碼就能實(shí)現(xiàn)地圖功能捉兴,以后要修改地圖蝎困,直接將BaiduMapFactory 換成GaodeMapFactory即可。
4>工廠方法總結(jié):定義一個用于創(chuàng)建對象的接口倍啥,是由子類決定實(shí)例化那種對象。與父類無關(guān)澎埠。
二虽缕、簡單工廠
簡單工廠相比工廠方法父類多了一些邏輯的判斷,父類根據(jù)一些條件作出相應(yīng)的判斷來取出子類蒲稳。氮趋,客戶端給工廠基類條件,基類通過判斷來實(shí)例化對應(yīng)的子類江耀。
IMapFactory *mapFactory = [[IMapFactory alloc] getMapFactoryWithFrame:self.view.bounds type:baidu];
[self.view addSubview:mapFactory];
基類的條件判斷
#import "IMapFactory.h"
#import "BaiduMapFactory.h"
#import "GaodeMapFactory.h"
@implementation IMapFactory
- (id)getMapFactoryWithFrame:(CGRect)frame type:(mapType)type {
if (type == baidu) {
return [[BaiduMapFactory alloc] getMapFactoryWithFrame:frame type:type];
} else {
return [[GaodeMapFactory alloc] getMapFactoryWithFrame:frame type:type];
}
}
@end
優(yōu)點(diǎn):在客戶端剩胁,就可以不用導(dǎo)入子類的頭文件了,所有的操作都是客戶端通過條件祥国,讓基類自己來實(shí)例化子對象昵观。