首页 > 技术文章 > 工厂模式的一点疑问

dixonyy 2014-11-29 16:32 原文

最近看了一下设计模式中的工厂模式,对于其中的工厂方法模式有一点疑问,在此记录,方便以后学习所需。

首先工厂模式是为了满足开闭原则:扩展开放,修改封闭。

对比一下简单工厂模式和工厂方法模式,会发现简单工厂模式中的createBMW()方法中包含的选择生成方法的switch语句,在工厂方法模式中的工厂类里没地方放,因此只能移交给客户,由客户来做switch。好了,那么问题来了(挖掘机哪家强?),在工厂方法中真的满足开闭原则吗?是的,工厂类和产品类满足,可是客户类呢?增加一个产品就必须到客户类里修改switch语句,这不是一样违反了修改封闭吗?这样的话还不如把switch语句拿出来再弄一个类,姑且先叫它choose类吧。这时候再仔细看工厂方法模式,假设,我们将工厂子类和产品子类合到一起,那么是不是和简单工厂模式有点像呢?事实上,为什么不可以合到一起呢?那么实际上工厂方法模式真的比简单工厂模式好吗?最多理解其增加了一个适配层。

盗用几张宝马案例的图片

简单工厂模式:

工厂方法模式:

抽象工厂模式:

下面再记录一下对抽象工厂模式的认识。

我的理解它也和工厂方法一样,应该把switch语句从客户类里抽出来。后面由于工厂子类还要选择多个产品来组合成目标产品,所以工厂子类还是有存在的必要的,这就像是二级客户了,本质上感觉有点像简单工厂里还有简单工厂。

 

今天开会听到他们在讨论开发模式,忍不住把这个疑问提了出来,会后辉云姐竟然来找我了(哈哈),跟她一起讨论,我总算是理解了。(谢谢辉云姐了,感觉辉云姐人真好,这才是“码农”的感觉!)

结果:一直将客户类加在了我思考开闭原则里了,其实开闭原则主要是针对工具类、公共类等等来说的,客户类其实就相当于C程序中的主函数(这C语言的思考方式什么时候能变通一下),由它来调用公共类,当然在做拓展的时候它要变了,所以把一些拓展时必然要变动的拿出来是正确的啊!!!然后就是一些不是全部公共但是又部分公共(好纠结)的预处理之类的放到操作类派生出来的子类里,肯定也是对的。总之,哦了。

推荐阅读