技术心得---设计模式(二)简单工厂
1 什么时候用
java编程的时候我们常常将一个原则,“面向接口编程”,其目的主要是“封装隔离”,而面向接口编程的时候,我们要想在client端调用接口的功能,就要实例化一个接口的实现,而接口只是用来定义规范的,它的具体实现可能会有很多种,如果client端要改变实现的功能,就要实例化接口的其他实现,接口新增了一种实现,client端想调用,也得改client端代码,然后重新编译,我们用简单工厂就可以解决这种问题,client端不用改,就可以使用新的功能实现。
另外,如果做的灵活一些,还可以在client端使用配置的方式来选择实现,其实这才是简单工厂真正的本质功能:选择实现。
简单工厂的本质:选择实现。
举个例子吧,我们之前的项目中要用到发短信的功能,一开始用亿美短信平台,后来发现第三方平台偶尔会有问题,或者是没有及时充值发不出短信,于是又申请了漫道短信平台,如果一个平台因为维护啊余额啊神马的原因暂停服务,可以马上切到另一个平台,那发短信的时候实例化不能总是手动修改代码实例化不同的短信接口,然后打包发布吧,所以就可以使用简单工厂(当然最终实现不是简单的这样搞~),配置文件(或数据库)配置当前使用的短信client,切换的时候只要改配置马上就能切过去,爽吧~~
2 怎么用
核心就是建立一个工厂类,XxxFactory,然后在工厂类中实例化目标对象,XxxFactory.newInstance(这里可以有参数,用来选择实现,也可以方法中根据配置选择),调用放使用工厂来产生目标实例,其实就这样,实现可以实现接口,抽象类,具体类,还可以做很多事情,比如根据配置文件实例化对象,或者根据传入的参数反射实例化对象,还可以根单例啊,原型啊等设计模式配合使用,简单哇~
3 示例
用刚刚短信的例子吧,这只是一个简单的应用,其实用简单工厂可以实现各种各样的效果。
(想好了,但是十点半了,明天还上班,迟到罚50~~~先睡了,明天补吧)
// TODO ...
4 类图
这个类图也只是一种简单应用。
(想好了,但是十点半了,明天还上班,迟到罚50~~~先睡了,明天补吧)
// TODO ...
5 优点与弊端
有点显而易见了,隔离封装,解耦。
其实弊端也可以不是弊端,看怎么用怎么想了,比如如果客户端用配置文件选择实现,传入创建工厂得到实例化对象的话,客户端还是得关心具体的实现的,又或者工厂的构造一般要私有的,那么也就不能简单的用工厂子类来改变工厂实现了,再或者工厂返回目标对象的同时,还可以做其他很多的事情,这样其实换个角度想可能还是有些问题的,等等等,看怎么看了~
总之,简单工厂的本质就是选择实现,它可以对代码进行隔离封装,达到解耦目的,也可以达到一些其它的目的,知道它是怎么回事,思想是什么,灵活应用就好。