既然避免不了,我們就應該把需要變動的隔離出來,不變的放另外的地方。
載入蘋果地圖很方便,官方都有文件,主要是mapkit
框架,這個就不多說了,好,我們把**整合到工程裡面去:
cgrect rect=[uiscreen mainscreen].bounds;_mapview=[[mkmapview alloc]initwithframe:rect];
[self.view addsubview:_mapview];
//設定**
_mapview.
delegate
=self;
//請求定位服務
_locationmanager=[[cllocationmanager alloc]init];
if(![cllocationmanager locationservicesenabled]||[cllocationmanager authorizationstatus]!=kclauthorizationstatusauthorizedwheninuse)
//使用者位置追蹤(使用者位置追蹤用於標記使用者當前位置,此時會呼叫定位服務)
_mapview.usertrackingmode=mkusertrackingmodefollow;
//設定地圖型別
_mapview.maptype=mkmaptypestandard;
//新增大頭針
[self addannotation];
一切都很完美,可是突然領導對我們說,蘋果地圖不好用,我們要用google的,好,我們把上面的**注釋掉,然後到google的官網上查api,然後再整合。
好吧,google地圖和蘋果地圖完全不一樣,**重新寫,結構變了:
googlemapentry *entry = [[googlemapentry alloc] init];
if (object!=nil && [object iskindofclass:[nsdictionary class]])
gmscameraposition *camera = [gmscameraposition camerawithlatitude:-33.86 longitude:151.20 zoom:6];
[entry setmapview:[gmsmapview mapwithframe:cgrectzero camera:camera]];
((gmsmapview *)entry.mapview).mylocationenabled =yes;
。。。。。
然後改呼叫的地方,全文搜尋,改了一兩天,終於改好了,問題又來了,由於**不相容,執行的時候老是報方法找不到。。
我們有更好的方法嗎?
我們通過對比蘋果地圖和google地圖,發現其實要顯示乙個地圖呀,兩個api有類似的方法,初始化地圖並顯示和新增大頭針,
於是,我們提出這兩個方法,寫到基類裡面:
#import
@inte***ce supermapthird : nsobject
@property(nonatomic,retain) idmapview;
+(id)initmapthirduserinfo:(id)object;
/*** 新增大頭針
** @param userinfo key: latitude, longitude
*/-(void)addannotationview:(id)userinfo;
@end
蘋果地圖繼承這兩個基類:
#import "supermapthird.h"
@end
#import
#import "mkmapview+mapviewutil.h"
+(id)initmapthirduserinfo:(id)object
-(void)addannotationview:(id)userinfo
}@end
谷歌地圖也繼承這個類:
#import
#import
#import "supermapthird.h"
@inte***ce googlemapentry : supermapthird
@end
#import "googlemapentry.h"
@implementation googlemapentry
+(id)initmapthirduserinfo:(id)object
-(void)addannotationview:(id)userinfo
}@end
然後,我們通過乙個工廠來建立不同的地圖例項:
#import
#import "supermapthird.h"
@inte***ce mapthirdfactory : nsobject
+(supermapthird *)getmapentry:(nsinteger)type userinf:(id)object;
@end
#import "mapthirdfactory.h"
#import "mapthirddefine.h"
#import "googlemapentry.h"
@implementation mapthirdfactory
+(supermapthird *)getmapentry:(nsinteger)type userinf:(id)object
return entry;
}@end
mapthirdmanage *manage = [[mapthirdmanage alloc] init];
[manage setmapthirdentry:[mapthirdfactory getmapentry:type userinf:object]];
然後實現他的兩個方法,
跟子類實現無關,所以我們不需要全文搜尋了,嘿嘿。。。
設計模式 工廠模式(簡單工廠模式和方法工廠模式)
一 簡單工廠模式 簡單工廠模式概述 又叫靜態工廠方法模式,它定義乙個具體的工廠類負責建立一些類的例項 優點 客戶端不需要在負責物件的建立,從而明確了各個類的職責 缺點 這個靜態工廠類負責所有物件的建立,如果有新的物件增加,或者某些物件的建立方式不同,就需要不斷的修改工廠類,不利於後期的維護 動物類 ...
工廠模式和策略模式的區別
工廠設計模式,用於建立複雜物件,管理多個不同功能介面 策略模式只是將同一功能的不同實現抽離出來,不需要管理物件 protocol nsobject id map getmap mapview功能 id location getlocation 定位功能 end 實現工廠協議獲取對應的物件 id ma...
策略模式和工廠模式的區別
uml圖 例項在模式結構上,兩者很相似 工廠模式是一種創造模式。戰略模式是一種運營模式。換句話說,工廠模式用於建立特定型別的物件。策略模式用於以特定方式執行乙個操作 或一組操作 在經典示例中,工廠可能會建立不同型別的動物 狗,貓,老虎,而策略模式將執行特定的動作,例如,移動 使用 跑步 步行 或 移...