iOS模式设计之--创建型:2、抽象工厂(Abstract Factory)

内容一:设计模式-分类?

`创建型模式`->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年多)
写框架不断的尝试,写错了再修改,在优化,泛型->命令

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容