iOS模式設計之--創(chuàng)建型:2、抽象工廠(Abstract Factory)

內容一:設計模式-分類?

`創(chuàng)建型模式`->5種:工廠方法模式、`*<抽象工廠模式>*`、單例模式、建造者模式、原型模式

`結構型模式`->7種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式

`行為型模式`->11種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、
備忘錄模式、狀態(tài)模式、訪問者模式、中介者模式、解釋器模式


內容二:工廠方法模式?

1、什么是工廠方法模式?(定義)
定義一個用于創(chuàng)建對象的統(tǒng)一的接口,然后由子類實現。

2、工廠方法模式->角色劃分:4個核心角色
角色一:抽象產品
角色二:具體產品
角色三:抽象工廠
角色四:具體工廠

3、工廠方法模式->原理案例?
工廠創(chuàng)建電腦->富士康工廠、華為工廠、三星工廠、蘋果工廠、聯想工廠…

如何知道你制造出來的產品是電腦?
因為:電腦標準規(guī)范(協議、接口)->特點
角色一:抽象產品->定義產品規(guī)范(規(guī)格)->電腦規(guī)范
角色二:具體產品->具體實現(具體制造目標)->具體電腦

具體電腦:華為電腦、三星電腦、蘋果電腦…
角色三:抽象工廠->定義工廠規(guī)范和標準
角色四:具體工廠->華為工廠、三星工廠

定義角色?

角色一:抽象產品->ComputerProtocol
角色二:具體產品->SXComputer、HWComputer、MacComputer…
角色三:抽象工廠->ComputerFactoryProtocol
角色四:具體工廠->SXComputerFactory、HWComputerFactory…

4、工廠方法模式->開發(fā)案例?

如何使用工廠方法模式?聚合SDK設計(分享組件)
地圖案例舉例子?
工廠目的:用于創(chuàng)建對象的?
分析需求:在我們的開發(fā)當中,場景,很多時候開發(fā)地圖、分享功能、支付功能…?

發(fā)現問題:當我們的需求變更的時候,你會發(fā)現我們項目迭代很麻煩?
例如:早上我的項目用百度地圖、下午我用高德地圖?
早上用的是支付寶、下午用的是微信?

修改代碼的時候就麻煩了,你需要不斷的去修改客戶端的代碼,由于你不短的修改,導致維護的成本在增加?也就意味著我的開發(fā)周期和效率降低了,非公司帶來的損失也就越大。由于越大也就導致了你的價值的體現。最終加班加點,熬夜加班,同時運氣差開除勸退。

解決方案:優(yōu)化代碼(項目重構)?
上一節(jié)課:適配器模式重構、今天晚上:工廠方法模式重構
采用工廠方法模式?

動態(tài)切換地圖(一鍵切換)
最少量的代碼,切換強大功能
實現代碼:定義每一個類?

1、分析角色?->方法
從0開發(fā)寫框架
角色一:抽象產品->地圖規(guī)范?
MapViewProtocol
百度地圖:BMKMapView?BMKMapView : UIView
高德地圖:MAMapView? MAMapView : UIView
結論:
1、所有的地圖MapView都是UIView子類
2、所有的地圖MapView都有類型:地圖類型、地圖語言、是否支持平移
共性問題、差異問題,先解決共性問題,再解決差異問題
定義一個協議

角色二:具體產品->具體地圖,例如:百度地圖、高德地圖…
百度地圖->BaiduMapView
高德地圖->GaodeMapView

角色三:抽象工廠->生成地圖
具體是什么工廠->地圖標準
MapFactoryProtocol

角色四:具體工廠->具體地圖,例如:百度工廠、高德工廠…
BaiduMapFactory、GaodeMapFactory

動態(tài)切換? 發(fā)現問題:還是需要修改客戶端的代碼?
達到目的:不修改客戶端代碼就能夠達到要求?

解決方案:
1、用plist文件配置?->iOS自帶的配置文件(特殊有規(guī)范的xml文件)
2、用xml配置文件(自定義xml文件)
3、用json文件配置
4、宏定義也行
如何實現?
確定方案:用xml配置文件(自定義xml文件)

1、分析文件結構?

加載地圖需要哪些參數?

1、第一個規(guī)范:這個key就是公共屬性(標簽)
百度地圖->key
高德地圖->key
2、第二個規(guī)范,工廠屬性:factory = "BaiduMapFactory"
key->對應地圖->對應工廠
baidu->key->BaiduMapFactory
geode->key->GaodeMapFactory

3、第三個規(guī)范->需要編號
id = 1,id = 2

4、第四個規(guī)范
百度地圖、高德地圖、google地圖…加載哪一個?
開關按鈕(控制加載哪一個地圖)
isOpen = "YES"
如果用戶所有的地圖都設置了"YES",默認啟用第一個地圖

2、實現代碼?->簡單工廠模式

首先:定義Model
其次:實現解析類
最后:簡單工廠模式來了
角色一:具體工廠 (一個類)
地圖引擎->MapEngine
作用:動態(tài)創(chuàng)建工廠(動態(tài)管理工廠)
解決客戶端修改代碼的問題

角色二:具體產品(類多了)
也可以通過服務器配置,返回xml解析(需求)
代碼是可配置的
地圖具體實現 + 抽象工廠模式
plist文件配置,自己實現
梳理一下->繪制一個UML
簡單工廠模式和工廠方法模式區(qū)別?
核心:類結構(角色上面區(qū)別)
簡單工廠->抽象第一步->工廠方法
工廠方法->抽象第二步->抽象工廠

簡單工廠角色?->MapEngine簡單工廠設計 兩個角色
角色一:具體工廠(一個)
角色二:具體產品(多個)

工廠方法角色
角色一:抽象產品(一個)
角色二:具體產品(多個)
角色三:抽象工廠(一個)
角色四:具體工廠(多個)

內容三:抽象工廠模式?

1、抽象工廠角色劃分?
特點->比工廠方法產品種類多
地圖案例?
模塊:地圖MapView模塊、定位模塊、導航模塊、搜索模塊…

工廠方法模式:只有1條流水線
創(chuàng)建MapView(產品)
抽象工廠模式:至少2條流水線
創(chuàng)建MapView(產品)
多個產品->多個抽象產品
MapView ->抽象->MapViewProtocol
MapLocation ->抽象->MapLocationProtocol
MapNavigation->抽象->MapNavigationProtocol
……
簡單工廠->抽象->工廠方法(抽象單個產品)->抽象(抽象多個產品)->抽象工廠

分析角色?
角色一:抽象產品A->MapViewProtocol
角色二:抽象產品B->MapLocationProtocol

角色三:具體產品A1->BaiduMapView
角色四:具體產品A2->GaodeMapView

角色五:具體產品B1->BaiduMapLocation
角色六:具體產品B2->GaodeMapLocation

角色七:抽象工廠->MapFactoryProtocol
角色八:具體工廠A->BaiduMapFactory
角色九:具體工廠B->GaodeMapFactory

2、工廠方法模式->具體實現代碼顯示一把?
百度地圖
地圖模塊 + 定位模塊,導航、搜索…你自己去實現
遇到無數問題,沒法抽象
分析 + 實現(代碼位置)

3、抽象工廠模式->具體實現代碼?
實現->擴展一個產品(抽象產品)
定義為案例說明
第一步:分析定位特點?
百度地圖->定位:mapView.showsUserLocation = YES;(圖層設置->歧義?)
高德地圖->定位:mapView.isShowsUserLocation = true
第二步:在我們的MapView中需要定義一個定位圖層屬性
第三步:定義MapLocationProtocol

標準很關鍵
1、共性問題(兩個地圖共同特點在哪里?)->最核心技術
百度地圖->BMKLocationService
定義回調->BMKLocationServiceDelegate
處理回調->MapLocationDelegateProtocol(定位結果)

高德地圖->
shardSDK、友盟…?(繼承各種分享組件)
關聯性在哪里?
需要哪個你就導入哪個?

2、差異問題(兩個地圖差異特點在哪里?)
第四步:在工廠中配置產品類(抽象產品類)?
抽象工廠中定義
第五步:定義MapLocationProtocol邏輯?->抽象產品角色(協議:一般都是抽象產品)
所有地圖中
必然存在:啟動定位(startLocation)、停止定位(stopLocatioin)、定位信息回調
第六步:具體實現->地圖產品實現
百度實現
高德實現

分析一下角色劃分?
角色一:抽象產品A->MapViewProtocol
角色二:抽象產品B->MapLocationProtocol

角色三:具體產品A1->BaiduMapView
角色四:具體產品A2->GaodeMapView

角色五:具體產品B1->BaiduMapLocation
角色六:具體產品B2->GaodeMapLocation

角色七:抽象工廠->MapFactoryProtocol
角色八:具體工廠A->BaiduMapFactory
角色九:具體工廠B->GaodeMapFactory
第七步:具體實現->工廠實現

找他的共性問題比較麻煩
找不到(麻煩過程給我們童鞋們演示,我原來我在寫框架時候,我是一個什么狀態(tài))
Navigation也是如此(很麻煩,痛苦)
框架建立前期很痛苦
自己平時很少寫框架(寫框架),模糊很正常,課后多看幾遍理解了

第八步:實現具體類->處理回調
1、百度實現類?
MapLocationDelegateProtocol
注意事項:地圖返回類型(數據類型->獨立類型)
獨立定義這個了類
當定位發(fā)生錯誤時,會調用代理的此方法。
連續(xù)定位回調函數。
定位權限狀態(tài)改變時回調函數
BMKLocation *location
封裝了->CLLocation(系統(tǒng)自帶)

2、定義BMKLocation協議->定位信息實現類->不能返回客戶端
高德地圖也是如此->一樣
注意:系統(tǒng)自帶我們是可以返回,SDK不行

3、實現百度地圖->定位數據->BaiduLocation
抽象類中->不實現->聲明(子類抽象功能到父類)
OC里面抽象類,在其他語言就不是了
在這里百度地圖:BMKUserLocation、BMKLocation(擴知道)->沒有太大區(qū)別->官方網址區(qū)別
之前地圖:習慣BMKUserLocation
后面會教你用哪個導入哪個,沒有任何影響
分享組件(需要哪個組件,你就配置導入哪個)

4、定義MapLocationDelegateProtocol規(guī)范(標準)
回調方法


總結:本節(jié)思路

繞暈了
1、分析定位特點:MapView定位基本屬性(最基本定義)
2、定義了屬性:在我們的MapView里面
3、定義抽象產品:MapLocationProtocol
4、抽象工廠中定義
5、分析MapLocationProtocol規(guī)范(回調)?
6、實現了我們的具體產品->地圖產品實現
百度定位->BaiduMapLocation
7、在我們的具體工廠里面實現了
GaodeMapFactory
BaiduMapFactory[獲取密碼](javascript:void(0))
實現了:-(id<MapLocationProtocol>)getMaplocation
8、具體的BaiduMapLocation實現
8.1 分析了MapLocationDelegateProtocol需要數據(回調數據)
BMKLocation *location
8.2 定義BMKLocation協議->定位信息實現類->不能返回客戶端
8.3 實現百度地圖->定位數據->BaiduLocation
8.4 定義MapLocationDelegateProtocol規(guī)范(標準)->實現了

分享經驗:分析別人架構設計?
第一步:抄寫別人的框架?
方法?
準備:明白框架結構
數據庫框架設計(更加繞)
抽象層次結構6層以上,某些模塊抽象8層
表達式->一步步來的
數據代碼量比較少,數據庫代碼量->1萬行左右(核心代碼,普通帶直接拷貝->大家都懂得)
多復習
手寫著框架
撥洋蔥(哭)
設計模式->框架設計->項目
1-2遍,2-3遍消化它:分析完了之后你會發(fā)現很牛逼的
什么時候使用工廠模式?:相同類型下,需要創(chuàng)建大量對象(管理)

地圖大量模塊對象
抽象->系統(tǒng)不需要(我的CTO教我的->帶我了2年多)
寫框架不斷的嘗試,寫錯了再修改,在優(yōu)化,泛型->命令

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容