内容一:设计模式-分类?
`创建型模式`->5种:工厂方法模式、`*<抽象工厂模式>*`、单例模式、建造者模式、原型模式
`结构型模式`->7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式
`行为型模式`->11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、
备忘录模式、状态模式、访问者模式、中介者模式、解释器模式
内容二:工厂方法模式?
1、什么是工厂方法模式?(定义)
定义一个用于创建对象的统一的接口,然后由子类实现。
2、工厂方法模式->角色划分:4个核心角色
角色一:抽象产品
角色二:具体产品
角色三:抽象工厂
角色四:具体工厂
3、工厂方法模式->原理案例?
工厂创建电脑->富士康工厂、华为工厂、三星工厂、苹果工厂、联想工厂…
如何知道你制造出来的产品是电脑?
因为:电脑标准规范(协议、接口)->特点
角色一:抽象产品->定义产品规范(规格)->电脑规范
角色二:具体产品->具体实现(具体制造目标)->具体电脑
具体电脑:华为电脑、三星电脑、苹果电脑…
角色三:抽象工厂->定义工厂规范和标准
角色四:具体工厂->华为工厂、三星工厂
定义角色?
角色一:抽象产品->ComputerProtocol
角色二:具体产品->SXComputer、HWComputer、MacComputer…
角色三:抽象工厂->ComputerFactoryProtocol
角色四:具体工厂->SXComputerFactory、HWComputerFactory…
4、工厂方法模式->开发案例?
如何使用工厂方法模式?聚合SDK设计(分享组件)
地图案例举例子?
工厂目的:用于创建对象的?
分析需求:在我们的开发当中,场景,很多时候开发地图、分享功能、支付功能…?
发现问题:当我们的需求变更的时候,你会发现我们项目迭代很麻烦?
例如:早上我的项目用百度地图、下午我用高德地图?
早上用的是支付宝、下午用的是微信?
修改代码的时候就麻烦了,你需要不断的去修改客户端的代码,由于你不短的修改,导致维护的成本在增加?也就意味着我的开发周期和效率降低了,非公司带来的损失也就越大。由于越大也就导致了你的价值的体现。最终加班加点,熬夜加班,同时运气差开除劝退。
解决方案:优化代码(项目重构)?
上一节课:适配器模式重构、今天晚上:工厂方法模式重构
采用工厂方法模式?
动态切换地图(一键切换)
最少量的代码,切换强大功能
实现代码:定义每一个类?
1、分析角色?->方法
从0开发写框架
角色一:抽象产品->地图规范?
MapViewProtocol
百度地图:BMKMapView?BMKMapView : UIView
高德地图:MAMapView? MAMapView : UIView
结论:
1、所有的地图MapView都是UIView子类
2、所有的地图MapView都有类型:地图类型、地图语言、是否支持平移
共性问题、差异问题,先解决共性问题,再解决差异问题
定义一个协议
角色二:具体产品->具体地图,例如:百度地图、高德地图…
百度地图->BaiduMapView
高德地图->GaodeMapView
角色三:抽象工厂->生成地图
具体是什么工厂->地图标准
MapFactoryProtocol
角色四:具体工厂->具体地图,例如:百度工厂、高德工厂…
BaiduMapFactory、GaodeMapFactory
动态切换? 发现问题:还是需要修改客户端的代码?
达到目的:不修改客户端代码就能够达到要求?
解决方案:
1、用plist文件配置?->iOS自带的配置文件(特殊有规范的xml文件)
2、用xml配置文件(自定义xml文件)
3、用json文件配置
4、宏定义也行
如何实现?
确定方案:用xml配置文件(自定义xml文件)
1、分析文件结构?
加载地图需要哪些参数?
1、第一个规范:这个key就是公共属性(标签)
百度地图->key
高德地图->key
2、第二个规范,工厂属性:factory = "BaiduMapFactory"
key->对应地图->对应工厂
baidu->key->BaiduMapFactory
geode->key->GaodeMapFactory
3、第三个规范->需要编号
id = 1,id = 2
4、第四个规范
百度地图、高德地图、google地图…加载哪一个?
开关按钮(控制加载哪一个地图)
isOpen = "YES"
如果用户所有的地图都设置了"YES",默认启用第一个地图
2、实现代码?->简单工厂模式
首先:定义Model
其次:实现解析类
最后:简单工厂模式来了
角色一:具体工厂 (一个类)
地图引擎->MapEngine
作用:动态创建工厂(动态管理工厂)
解决客户端修改代码的问题
角色二:具体产品(类多了)
也可以通过服务器配置,返回xml解析(需求)
代码是可配置的
地图具体实现 + 抽象工厂模式
plist文件配置,自己实现
梳理一下->绘制一个UML
简单工厂模式和工厂方法模式区别?
核心:类结构(角色上面区别)
简单工厂->抽象第一步->工厂方法
工厂方法->抽象第二步->抽象工厂
简单工厂角色?->MapEngine简单工厂设计 两个角色
角色一:具体工厂(一个)
角色二:具体产品(多个)
工厂方法角色
角色一:抽象产品(一个)
角色二:具体产品(多个)
角色三:抽象工厂(一个)
角色四:具体工厂(多个)
内容三:抽象工厂模式?
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、工厂方法模式->具体实现代码显示一把?
百度地图
地图模块 + 定位模块,导航、搜索…你自己去实现
遇到无数问题,没法抽象
分析 + 实现(代码位置)
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
第七步:具体实现->工厂实现
找他的共性问题比较麻烦
找不到(麻烦过程给我们童鞋们演示,我原来我在写框架时候,我是一个什么状态)
Navigation也是如此(很麻烦,痛苦)
框架建立前期很痛苦
自己平时很少写框架(写框架),模糊很正常,课后多看几遍理解了
第八步:实现具体类->处理回调
1、百度实现类?
MapLocationDelegateProtocol
注意事项:地图返回类型(数据类型->独立类型)
独立定义这个了类
当定位发生错误时,会调用代理的此方法。
连续定位回调函数。
定位权限状态改变时回调函数
BMKLocation *location
封装了->CLLocation(系统自带)
2、定义BMKLocation协议->定位信息实现类->不能返回客户端
高德地图也是如此->一样
注意:系统自带我们是可以返回,SDK不行
3、实现百度地图->定位数据->BaiduLocation
抽象类中->不实现->声明(子类抽象功能到父类)
OC里面抽象类,在其他语言就不是了
在这里百度地图:BMKUserLocation、BMKLocation(扩知道)->没有太大区别->官方网址区别
之前地图:习惯BMKUserLocation
后面会教你用哪个导入哪个,没有任何影响
分享组件(需要哪个组件,你就配置导入哪个)
4、定义MapLocationDelegateProtocol规范(标准)
回调方法
总结:本节思路
绕晕了
1、分析定位特点:MapView定位基本属性(最基本定义)
2、定义了属性:在我们的MapView里面
3、定义抽象产品:MapLocationProtocol
4、抽象工厂中定义
5、分析MapLocationProtocol规范(回调)?
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规范(标准)->实现了
分享经验:分析别人架构设计?
第一步:抄写别人的框架?
方法?
准备:明白框架结构
数据库框架设计(更加绕)
抽象层次结构6层以上,某些模块抽象8层
表达式->一步步来的
数据代码量比较少,数据库代码量->1万行左右(核心代码,普通带直接拷贝->大家都懂得)
多复习
手写着框架
拨洋葱(哭)
设计模式->框架设计->项目
1-2遍,2-3遍消化它:分析完了之后你会发现很牛逼的
什么时候使用工厂模式?:相同类型下,需要创建大量对象(管理)
地图大量模块对象
抽象->系统不需要(我的CTO教我的->带我了2年多)
写框架不断的尝试,写错了再修改,在优化,泛型->命令