接着
设计模式-工厂模式-原理剖析
继续剖析
1.工厂方法模式->开发案例? 地图案例举例子?
工厂目的:用于创建对象的?(工厂只负责创建对象,生宝宝,不处理业务逻辑)
分析需求:在我们的开发当中,场景,很多时候开发地图、分享功能、支付功能…?
发现问题:当我们的需求变更的时候,你会发现我们项目迭代很麻烦?
例如:早上我的项目用百度地图、下午我用高德地图?
早上用的是支付宝、下午用的是微信?修改代码的时候就麻烦了,你需要不断的去修改客户端的代码,由于你不短的修改,导致维护的成 本在增加?也就意味着我的开发周期和效率降低了,非公司带来的损失也就越大。由于越大也就导致了你的价值的体现。
解决方案:优化代码(项目重构)?
采用工厂方法模式?
动态切换地图(一键切换)
最少量的代码,切换强大功能
实现代码:定义每一个类?
1、分析角色?->方法
角色一:抽象产品->地图规范?
MapViewProtocol
百度地图:BMKMapView?
BMKMapView : UIView
高德地图:MAMapView?
MAMapView : UIView
结论:
1、所有的地图MapView都是UIView子类
2、所有的地图MapView都有类型
地图类型、地图语言、是否支持平移....
共性问题、差异问题,先解决共性问题,再解决差异问题
定义一个协议
BaiduMapView
角色二:具体产品->具体地图
例如:百度地图、高德地图…
百度地图->BaiduMapView
高德地图->GaodeMapView
高的地图同理,创建.
具体百度地图,创建地图的大小(高德同理)
角色三:抽象工厂->生成地图
具体是什么工厂->地图标准
MapFactoryProtocol
角色四:具体工厂->具体地图
例如:百度工厂、高德工厂…
BaiduMapFactory、GaodeMapFactory
run run run .... 面向协议编程,暴露给客户端的,全是协议
不需要改太多代码,就能实现切换.
还不完善,如下:
动态切换?发现问题:还是需要修改客户端的代码?
达到目的:不修改客户端代码就能够达到要求?
解决方案:
1、用plist文件配置?->iOS自带的配置文件(特殊有规范的xml文件)
2、用xml配置文件(自定义xml文件)
3、用json文件配置
4、宏定义也行
如何实现?
确定方案:用xml配置文件(自定义xml文件)
1、分析文件结构?
加载地图需要哪些参数?
1、第一个规范
百度地图->key
高德地图->key
这个key就是公共属性(标签)
2、第二个规范
key->对应地图->对应工厂
baidu->key->BaiduMapFactory
geode->key->GaodeMapFactory
工厂属性:factory = "BaiduMapFactory"
3、第三个规范->需要编号
id = 1,id = 2
4、第四个规范
百度地图、高德地图、google地图…加载哪一个?
开关按钮(控制加载哪一个地图)
isOpen = "YES"
如果用户所有的地图都设置了"YES",默认启用第一个地图
2、实现代码?->简单工厂模式
这种配置打包包里,别人是可以看到的,当然也可以加密的.把它变成plist文件.然后加密
首先:定义Model
其次:实现解析类
最后:简单工厂模式来了
角色一:具体工厂 (一个类)
地图引擎->MapEngine
作用:动态创建工厂(动态管理工厂)
解决客户端修改代码的问题
角色二:具体产品(类多了)
也可以通过服务器配置,返回xml解析(需求)
代码是可配置的