研磨设计模式 之 工厂系列(一)简单工厂模式
2012-07-31 22:56
357 查看
第一个系列就是工厂模式吧,因为在实际开发中,这个系列的模式用的还是蛮多的,优秀的框架必须之一,所以我们要好好学习之……
推荐博文:http://chjavach.iteye.com/blog/815160
推荐博文:http://chjavach.iteye.com/blog/834679
实际上看完这两篇博文就基本上对简单工厂有所掌握,而我们重点要关心的是如何去用,什么时候去用。
注意简单工厂的重点在选择,实现是已经做好了的。就算实现再简单,也要由具体的实现类来实现,而不是在简单工厂里面来实现。简单工厂的目的在于为客户端来选择相应的实现,从而使得客户端和实现之间解耦,这样一来,具体实现发生了变化,就不用变动客户端了,这个变化会被简单工厂吸收和屏蔽掉。
实现简单工厂的难点就在于 “如何选择”实现,前面讲到了几种传递参数的方法,那都是静态的参数,还可以实现成为动态的参数。比如:在运行期间,由工厂去读取某个内存的值,或者是去读取数据库中的值,然后根据这个值来选择具体的实现等等。
如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选用简单工厂,让客户端通过工厂来获取相应的接口,而无需关心具体实现
如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,一个简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到一个简单工厂来,从而实现集中管理和控制
简单工厂虽然很简单,但是非常友好的帮助我们实现了组件的封装,然后让组件外部能真正面向接口编程。
解耦
通过简单工厂,实现了客户端和具体实现类的解耦。
如同上面的例子,客户端根本就不知道具体是由谁来实现,也不知道具体是如何实现的,客户端只是通过工厂获取它需要的接口对象。
可能增加客户端的复杂度
如果通过客户端的参数来选择具体的实现类,那么就必须让客户端能理解各个参数所代表的具体功能和含义,这会增加客户端使用的难度,也部分暴露了内部实现,这种情况可以选用可配置的方式来实现。
不方便扩展子工厂
私有化简单工厂的构造方法,使用静态方法来创建接口,也就不能通过写简单工厂类的子类来改变创建接口的方法的行为了。不过,通常情况下是不需要为简单工厂创建子类的。
总结:
简单工厂模式一定程度违背了开闭原则(OCP),如果业务需要拓展,我们一般情况下是不会修改源码的,要么继承,要么新写一个类,这样才符合软件设计的标准。
简单工厂也会暴露给客户端接口,虽然这个可以通过配置来解决,但是感觉也不是那么好,还是那句话,仁者见仁吧……
推荐博文:http://chjavach.iteye.com/blog/815160
推荐博文:http://chjavach.iteye.com/blog/834679
实际上看完这两篇博文就基本上对简单工厂有所掌握,而我们重点要关心的是如何去用,什么时候去用。
一、思考简单工厂
1:简单工厂的本质
简单工厂的本质是:选择实现。注意简单工厂的重点在选择,实现是已经做好了的。就算实现再简单,也要由具体的实现类来实现,而不是在简单工厂里面来实现。简单工厂的目的在于为客户端来选择相应的实现,从而使得客户端和实现之间解耦,这样一来,具体实现发生了变化,就不用变动客户端了,这个变化会被简单工厂吸收和屏蔽掉。
实现简单工厂的难点就在于 “如何选择”实现,前面讲到了几种传递参数的方法,那都是静态的参数,还可以实现成为动态的参数。比如:在运行期间,由工厂去读取某个内存的值,或者是去读取数据库中的值,然后根据这个值来选择具体的实现等等。
2:何时选用简单工厂
建议在如下情况中,选用简单工厂:如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选用简单工厂,让客户端通过工厂来获取相应的接口,而无需关心具体实现
如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,一个简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到一个简单工厂来,从而实现集中管理和控制
二 、简单工厂的优缺点
帮助封装简单工厂虽然很简单,但是非常友好的帮助我们实现了组件的封装,然后让组件外部能真正面向接口编程。
解耦
通过简单工厂,实现了客户端和具体实现类的解耦。
如同上面的例子,客户端根本就不知道具体是由谁来实现,也不知道具体是如何实现的,客户端只是通过工厂获取它需要的接口对象。
可能增加客户端的复杂度
如果通过客户端的参数来选择具体的实现类,那么就必须让客户端能理解各个参数所代表的具体功能和含义,这会增加客户端使用的难度,也部分暴露了内部实现,这种情况可以选用可配置的方式来实现。
不方便扩展子工厂
私有化简单工厂的构造方法,使用静态方法来创建接口,也就不能通过写简单工厂类的子类来改变创建接口的方法的行为了。不过,通常情况下是不需要为简单工厂创建子类的。
总结:
简单工厂模式一定程度违背了开闭原则(OCP),如果业务需要拓展,我们一般情况下是不会修改源码的,要么继承,要么新写一个类,这样才符合软件设计的标准。
简单工厂也会暴露给客户端接口,虽然这个可以通过配置来解决,但是感觉也不是那么好,还是那句话,仁者见仁吧……
相关文章推荐
- PHP设计模式-工厂系列(一)-简单工厂模式(静态工厂模式)
- PHP设计模式-工厂系列(一)-简单工厂模式(静态工厂模式)
- 设计模式系列(2) 工厂模式之简单工厂模式
- 研磨设计模式之工厂方法模式-3 ――跟着cc学设计系列
- 研磨设计模式之工厂方法模式-5 ――跟着cc学设计系列
- 研磨设计模式之工厂方法模式-1
- 深入理解JavaScript系列(28):设计模式之工厂模式
- 深入理解JavaScript系列(28):设计模式之工厂模式
- iOS常用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)
- 研磨设计模式 之 备忘录模式(Memento)1??跟着cc学设计系列
- 设计模式系列之二:工厂方法模式
- 研磨设计模式之简单工厂模式-3
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- [Java] 设计模式之工厂系列 04 (自定义模拟 spring 读取xml文件 beanFactory)
- 研磨设计模式之工厂方法模式-3
- 设计模式系列四 工厂(工厂方法、抽象工厂)模式介绍
- 设计模式系列10---高度定制的抽象工厂方法模式
- 设计模式系列——简单工厂模式
- 研磨设计模式 之 代理模式(Proxy)1——跟着cc学设计系列
- java与设计模式(三)-简单工厂模式(静态工厂)