设计模式-工厂模式-抽象工厂模式

接着

设计模式-工厂模式-开发案列-工厂实现

继续剖析

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、工厂方法模式->具体实现代码显示一把?

        百度地图

        地图模块+ 定位模块,导航、搜索…你自己去实现


加载

我们要把这些代码抽象,抽象到工厂里

之前是

设计模式-工厂模式-抽象工厂模式_第1张图片


设计模式-工厂模式-抽象工厂模式_第2张图片
现在

同步一下高德地图

设计模式-工厂模式-抽象工厂模式_第3张图片
base工厂也要修改(新增)


设计模式-工厂模式-抽象工厂模式_第4张图片
地图初始化工作完成了

我把控制器里创建的 BMKMapView* mapView = [[BMKMapView alloc]initWithFrame:self.view.bounds];

放到


viewController创建对象修改

设计模式-工厂模式-抽象工厂模式_第5张图片

3、抽象工厂模式->具体实现代码?

        实现->扩展一个产品(抽象产品)

        定位为案例说明

        第一步:分析定位特点?

            百度地图->定位

                    图层设置->歧义?

                    mapView.showsUserLocation = YES;

            高德地图->定位

                    mapView.isShowsUserLocation = true


        第二步:在我们的MapView中需要定义一个定位图层属性


设计模式-工厂模式-抽象工厂模式_第6张图片

       第三步:定义MapLocationProtocol

            标准很关键


设计模式-工厂模式-抽象工厂模式_第7张图片
共性问题

            1、共性问题(两个地图共同特点在哪里?)->最核心技术

                    百度地图->BMKLocationService

                    创建BaiduMapLocation类,并引入MapLocationProtocol抽象产品类

                    定义回调->BMKLocationServiceDelegate 定位结果

                   处理回调->MapLocationDelegateProtocol

                            创建MapLocationDelegateProtocol类,地图的回调

设计模式-工厂模式-抽象工厂模式_第8张图片

                高德地图->

                 shardSDK、友盟…?(继承各种分享组件)

                关联性在哪里?

                 需要哪个你就导入哪个?没有定位图层

//         2、差异问题(两个地图差异特点在哪里?)

    第四步:在工厂中配置产品类(抽象产品类)?

              抽象工厂中定义

设计模式-工厂模式-抽象工厂模式_第9张图片

            创建BaiduMapLocation类,具体产品

       第五步:定义MapLocationProtocol逻辑?->抽象产品角色


设计模式-工厂模式-抽象工厂模式_第10张图片

                所有地图中

               必然存在:启动定位(startLocation)、停止定位(stopLocatioin)、定位信息回调

        第六步:具体实现->地图产品实现

                百度实现


设计模式-工厂模式-抽象工厂模式_第11张图片

                高德实现

            分析一下角色划分?

                角色一:抽象产品A->MapViewProtocol

                角色二:抽象产品B->MapLocationProtocol

                    …

                角色三:具体产品A1->BaiduMapView

                角色四:具体产品A2->GaodeMapView

                    …

                角色五:具体产品B1->BaiduMapLocation

                角色六:具体产品B2->GaodeMapLocation

                …            

                角色七:抽象工厂->MapFactoryProtocol

                角色八:具体工厂A->BaiduMapFactory

                角色九:具体工厂B->GaodeMapFactory

        第七步:具体实现->工厂实现


设计模式-工厂模式-抽象工厂模式_第12张图片
高德也同理

当我的引擎发生切换的时候,我的客户端代码,不需要有任何修改,因为都是面向协议的...

            分析后:找他的共性问题比较麻烦,找不到(麻烦过程给大家演示,我原来我在写框架时候,我是一个什么状态)

            Navigation也是如此(很麻烦,痛苦)

            框架建立前期很痛苦

            自己平时很少写框架(写框架),模糊很正常,多看几遍理解了

      第八步:实现具体类->处理回调

            1、百度实现类?


设计模式-工厂模式-抽象工厂模式_第13张图片

MapLocationDelegateProtocol

        注意事项:地图返回类型(数据类型->独立类型)

                独立定义这个了类

                当定位发生错误时,会调用代理的此方法。

                连续定位回调函数。

                定位权限状态改变时回调函数


                BMKLocation *location

                封装了->CLLocation(系统自带)

        2、定义BMKLocation协议->定位信息实现类->不能返回客户端

            高德地图也是如此->一样

            注意:系统自带我们是可以返回,SDK不行

       3、实现百度地图->定位数据->BaiduLocation


设计模式-工厂模式-抽象工厂模式_第14张图片

            创建BaiduLocation类


设计模式-工厂模式-抽象工厂模式_第15张图片
设计模式-工厂模式-抽象工厂模式_第16张图片

            抽象类中->不实现->声明(子类抽象功能到父类)

            OC里面抽象类,在其他语言就不是了

            在这里百度地图:BMKUserLocation、BMKLocation(扩知道)->没有太大区别->官方网址区别

            之前地图:习惯BMKUserLocation

        4、定义MapLocationDelegateProtocol规范(标准)

                回调方法


设计模式-工厂模式-抽象工厂模式_第17张图片
把它拷贝到下图里的代码


设计模式-工厂模式-抽象工厂模式_第18张图片


设计模式-工厂模式-抽象工厂模式_第19张图片
设计模式-工厂模式-抽象工厂模式_第20张图片


设计模式-工厂模式-抽象工厂模式_第21张图片

总结:本堂课思路

绕晕了

1、分析定位特点->MapView定位基本属性(最基本定义)

2、定义了属性->在我们的MapView里面

3、定义抽象产品->MapLocationProtocol

4、抽象工厂中定义

5、分析MapLocationProtocol规范(回调)?

6、实现了我们的具体产品->地图产品实现

百度定位->BaiduMapLocation

7、在我们的具体工厂里面实现了

GaodeMapFactory

BaiduMapFactory

实现了:-(id)getMaplocation

8、具体的BaiduMapLocation实现

8.1 分析了MapLocationDelegateProtocol需要数据(回调数据)

BMKLocation *location

8.2 定义BMKLocation协议->定位信息实现类->不能返回客户端

8.3 实现百度地图->定位数据->BaiduLocation

8.4 定义MapLocationDelegateProtocol规范(标准)->实现了

你可能感兴趣的:(设计模式-工厂模式-抽象工厂模式)