设计模式-工厂模式-抽象工厂模式
接着
设计模式-工厂模式-开发案列-工厂实现
继续剖析
1、抽象工厂角色划分?
特点->比工厂方法产品种类多
地图案例?
模块:地图MapView模块、定位模块、导航模块、搜索模块…
工厂方法模式:只有1条流水线
创建MapView(产品)
抽象工厂模式:至少2条流水线
创建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、工厂方法模式->具体实现代码显示一把?
百度地图
地图模块+ 定位模块,导航、搜索…你自己去实现
![](https://img.haomeiwen.com/i1901953/78567fb827cc7e8e.png)
![](https://img.haomeiwen.com/i1901953/7a1894eca5d53e6a.png)
我们要把这些代码抽象,抽象到工厂里
之前是
![](https://img.haomeiwen.com/i1901953/b87d123abb18d3eb.png)
![](https://img.haomeiwen.com/i1901953/379d7e557610db8b.png)
同步一下高德地图
![](https://img.haomeiwen.com/i1901953/fc06cd248c0e916b.png)
![](https://img.haomeiwen.com/i1901953/9d531fbac960850d.png)
我把控制器里创建的 BMKMapView* mapView = [[BMKMapView alloc]initWithFrame:self.view.bounds];
放到
![](https://img.haomeiwen.com/i1901953/a6a2be4807358218.png)
viewController创建对象修改
![](https://img.haomeiwen.com/i1901953/607d438f52f6ff97.png)
3、抽象工厂模式->具体实现代码?
实现->扩展一个产品(抽象产品)
定位为案例说明
第一步:分析定位特点?
百度地图->定位
图层设置->歧义?
mapView.showsUserLocation = YES;
高德地图->定位
mapView.isShowsUserLocation = true
第二步:在我们的MapView中需要定义一个定位图层属性
![](https://img.haomeiwen.com/i1901953/6fb6e74bb00fd530.png)
第三步:定义MapLocationProtocol
标准很关键
![](https://img.haomeiwen.com/i1901953/64dafc0f463b5f55.png)
1、共性问题(两个地图共同特点在哪里?)->最核心技术
百度地图->BMKLocationService
创建BaiduMapLocation类,并引入MapLocationProtocol抽象产品类
定义回调->BMKLocationServiceDelegate 定位结果
处理回调->MapLocationDelegateProtocol
创建MapLocationDelegateProtocol类,地图的回调
![](https://img.haomeiwen.com/i1901953/b99e64c6ec049b54.png)
高德地图->
shardSDK、友盟…?(继承各种分享组件)
关联性在哪里?
需要哪个你就导入哪个?没有定位图层
// 2、差异问题(两个地图差异特点在哪里?)
第四步:在工厂中配置产品类(抽象产品类)?
抽象工厂中定义
![](https://img.haomeiwen.com/i1901953/1efbf9e86926cf79.png)
创建BaiduMapLocation类,具体产品
第五步:定义MapLocationProtocol逻辑?->抽象产品角色
![](https://img.haomeiwen.com/i1901953/7f22e31b4d554451.png)
所有地图中
必然存在:启动定位(startLocation)、停止定位(stopLocatioin)、定位信息回调
第六步:具体实现->地图产品实现
百度实现
![](https://img.haomeiwen.com/i1901953/47271abd4f2d5dd3.png)
高德实现
分析一下角色划分?
角色一:抽象产品A->MapViewProtocol
角色二:抽象产品B->MapLocationProtocol
…
角色三:具体产品A1->BaiduMapView
角色四:具体产品A2->GaodeMapView
…
角色五:具体产品B1->BaiduMapLocation
角色六:具体产品B2->GaodeMapLocation
…
角色七:抽象工厂->MapFactoryProtocol
角色八:具体工厂A->BaiduMapFactory
角色九:具体工厂B->GaodeMapFactory
第七步:具体实现->工厂实现
![](https://img.haomeiwen.com/i1901953/148994294a957460.png)
当我的引擎发生切换的时候,我的客户端代码,不需要有任何修改,因为都是面向协议的...
![](https://img.haomeiwen.com/i1901953/0a0fe8fff78e4219.png)
分析后:找他的共性问题比较麻烦,找不到(麻烦过程给大家演示,我原来我在写框架时候,我是一个什么状态)
Navigation也是如此(很麻烦,痛苦)
框架建立前期很痛苦
自己平时很少写框架(写框架),模糊很正常,多看几遍理解了
第八步:实现具体类->处理回调
1、百度实现类?
![](https://img.haomeiwen.com/i1901953/3f0977efc7e7bd5a.png)
MapLocationDelegateProtocol
注意事项:地图返回类型(数据类型->独立类型)
独立定义这个了类
当定位发生错误时,会调用代理的此方法。
连续定位回调函数。
定位权限状态改变时回调函数
BMKLocation *location
封装了->CLLocation(系统自带)
![](https://img.haomeiwen.com/i1901953/c41c1c9675034b12.png)
2、定义BMKLocation协议->定位信息实现类->不能返回客户端
高德地图也是如此->一样
注意:系统自带我们是可以返回,SDK不行
3、实现百度地图->定位数据->BaiduLocation
![](https://img.haomeiwen.com/i1901953/8e7e61b90bcd8d22.png)
创建BaiduLocation类
![](https://img.haomeiwen.com/i1901953/3d1a58a9e511915b.png)
![](https://img.haomeiwen.com/i1901953/3ec9093bd9afefb9.png)
抽象类中->不实现->声明(子类抽象功能到父类)
OC里面抽象类,在其他语言就不是了
在这里百度地图:BMKUserLocation、BMKLocation(扩知道)->没有太大区别->官方网址区别
之前地图:习惯BMKUserLocation
4、定义MapLocationDelegateProtocol规范(标准)
回调方法
![](https://img.haomeiwen.com/i1901953/3de9ffe66abbc617.png)
![](https://img.haomeiwen.com/i1901953/0b422eb2acb03a4c.png)
![](https://img.haomeiwen.com/i1901953/683e8911fdb4a906.png)
![](https://img.haomeiwen.com/i1901953/44a35819e2a1f8cb.png)
![](https://img.haomeiwen.com/i1901953/19a5b86b8c38f3b9.png)
总结:本堂课思路
绕晕了
1、分析定位特点->MapView定位基本属性(最基本定义)
2、定义了属性->在我们的MapView里面
3、定义抽象产品->MapLocationProtocol
4、抽象工厂中定义
5、分析MapLocationProtocol规范(回调)?
6、实现了我们的具体产品->地图产品实现
百度定位->BaiduMapLocation
7、在我们的具体工厂里面实现了
GaodeMapFactory
BaiduMapFactory
实现了:-(id<MapLocationProtocol>)getMaplocation
8、具体的BaiduMapLocation实现
8.1 分析了MapLocationDelegateProtocol需要数据(回调数据)
BMKLocation *location
8.2 定义BMKLocation协议->定位信息实现类->不能返回客户端
8.3 实现百度地图->定位数据->BaiduLocation
8.4 定义MapLocationDelegateProtocol规范(标准)->实现了