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