封裝需求的變更 策略模式和工廠模式(一)

2021-07-02 11:58:45 字數 2942 閱讀 5468

既然避免不了,我們就應該把需要變動的隔離出來,不變的放另外的地方。

載入蘋果地圖很方便,官方都有文件,主要是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圖 例項在模式結構上,兩者很相似 工廠模式是一種創造模式。戰略模式是一種運營模式。換句話說,工廠模式用於建立特定型別的物件。策略模式用於以特定方式執行乙個操作 或一組操作 在經典示例中,工廠可能會建立不同型別的動物 狗,貓,老虎,而策略模式將執行特定的動作,例如,移動 使用 跑步 步行 或 移...