小白学设计模式:简单工厂模式
1、这个设计模式出现的背景或遇到的问题是啥?
2、这个模式背后的原理是啥,如何理解?
3、为什么用了这个模式后,软件灵活性提升了?
4、该模式的优缺点
还是围绕上面的四个问题来展开学习简单工厂模式。
1、背景或问题
我们家里会有各种各样的电器,电器的功能虽然不同,但他们都满足同样的电器接口:插座。
这个插座定义了电源的统一方式,我们给电器充电的时候,不需要知道是什么电器,不需要知道各个
电器的功能原理,我们只需要看到插座这个统一的接口即可,通过插座统一对不同的电器进行充电。
相反的,如果我们没有这个统一的接口,我们充电可能是怎么一种情况呢?很可能是下面这个样子:
对于冰箱:
1、new实例化一个冰箱
2、调用冰箱的上电接口开始上电
对于电视:
1、new实例化一个电视
2、调用电视的上电接口开始上电
……
大家可想而知,随着电器的越来越多,我们要管理的代码量也越来越多,而且我们需要了解每个电器的接口
细节,万一这些接口发生变化,我们还得全部重新修改,重新实现,这对我们软件工程师的日常工作无疑会
造成很大的浪费:为了创建电器对象,需要工程师熟悉所有的电器接口实现……
基于keep simple、keep stupid的想法,简单工厂就来了
2、简单工厂是如何解决这个问题的
既然我们的程序员哥哥觉得创造电器的过程按原有的方式很难搞,那我们就把创建电器这部分隔离起来,程序员
哥哥就安心专研客户的关键需求。那怎么隔离呢?我们就建了一个工厂,这个工厂就专门负责造电器,至于
电器如何实现的,程序员哥哥不需要了解细节了,只需要跟工厂打交道就行了,这就好像是原来造电器各有各的
接口,现在通过工厂流水线的方式完成了一次工业的统一一样,有什么需求,让工厂把这个对象制造出来就行
了。简单一句话:通过工厂这种通用方式,完成制造业的标准化。
3、软件灵活性为什么提升了
程序员哥哥不需要了解这个复杂的世界的所有对象,只需要了解工厂有什么能力制造什么对象就行了,从精力
的1对多,变为了1对1。
简单工厂的本质是:选择实现。
注意简单工厂的重点在选择,实现是已经做好了的。就算实现再简单,也要由具体的实现类来实现,而不是在简单工厂里面来实现。简单工厂的目的在于为客户端来选择相应的实现,从而使得客户端和实现之间解耦,这样一来,具体实现发生了变化,就不用变动客户端了,这个变化会被简单工厂吸收和屏蔽掉。
实现简单工厂的难点就在于“如何选择”实现,前面讲到了几种传递参数的方法,那都是静态的参数,还可以实现成为动态的参数。比如:在运行期间,由工厂去读取某个内存的值,或者是去读取数据库中的值,然后根据这个值来选择具体的实现等等。
4、缺点
可能增加使用者的复杂度:如果通过客户端的参数来选择具体的实现类,那么就必须让客户端能理解各个参数所代表的具体功能和含义,这会增加客户端使用的难度,也部分暴露了内部实现,这种情况可以选用可配置的方式来实现