设计模式之工厂模式

个人而言,由于写的代码并不是很多,因而对于很多的设计模式,实际上大多都只是停留在纸面的理解上。但是设计模式中的很多思想,还是很是值得我们去好好去理解研读的,所以很多设计模式还是要去熟悉一下的。

今天被问到工厂模式与new的区别,脑袋就那么断线了,有工厂模式这个概念,却把它的一些特性给忘了。充分暴露了学习不够深入,理解不够透彻的弊病了。所以就从工厂模式开始,慢慢复习一下设计模式吧。

先来回答上面那个问题吧,工厂模式往简单了说,其实就是把new一个对象的操作做了一些封装,往复杂的方向来说,则不仅仅是对new进行了封装,而且还将具体的实例化过程推迟到了具体的工厂子类中。

我们先从简单工厂开始,图个方便,就以《Head First设计模式》上的Pizza例子解释吧。

好了,现在我们有一家Pizza店PizzaStore,所有的Pizza都是PizzaStore自己生产的,每当有一种新的口味流行时,我们就要在这个类中间增加一种Pizza制作方法。当我们的店面还只是一个的时候,这样的方式还是可以接受的。很快,我们的Pizza店由于广受欢迎,在这个A城市开了很多分店。然后,问题就出来,每次新的Pizza出来时,我们都要对每个店面进行修改,这样的弊病会随着店面数量的增加而不断加重。于是,我们对其结构进行一次改造,我们把Pizza的生产任务交给一个独立的工厂SimplePizzaFactory,然后各个店面都从这个工厂中获取各种Pizza。这样,当每次出现新的Pizza的时候,我们就只需要更改一下SimplePizzaFactory就行了。

我们可以把这个叫做简单工厂模式,但事实上,简单工厂模式算不得设计模式,只能说是个良好的设计习惯吧,上图就为我们展示了简单工厂模式的类图结构。

过了好长时间,我们的Pizza店实在是太受欢迎了。于是乎我们开始在其他城市开设分店,可是问题也随之而来,我们发现其他城市的人们的口味对于同一种Pizza也是有所不同的,而我们原来的工厂只能统一生产同一口味的Pizza。于是,我们又把生产Pizza的权利转给Pizza店,让他们自己决定如何生产Pizza,而我们只需要提供一个统一的店面形象就行了,就像类图中描述的一样,而这个模式就是工厂模式了。

OK!问题似乎解决了!可是,我们最初遇到的品种增多的问题似乎又回来了。每当新种类出来,每家店面又都忙着添加新Pizza,这看起来好麻烦啊!身为爱偷懒的程序猿,怎么能容忍这么麻烦的事出现。于是,我们又改造了我们的Pizza店。

这次,我们决定还是把Pizza生产的权利收回来。在前面简单工厂模式的基础上,我们进一步改造,决定在每个城市建立一座Pizza工厂,当然,每个工厂由当地的城市去兴建,而我们只需要提供一个工厂的统一建设标准,至于每家工厂自己如何生产Pizza,我们就不再去关心了,而且,此后这个城市的Pizza分店都是从各自城市的Pizza工厂获取Pizza的,这既保证了Pizza的质量和品味,有保证了新产品增加的灵活性。其实,这个模式就是工厂模式的一个升级了,我们称之为抽象工厂模式,顾名思义,我们这次把工厂也给抽象化了。抽象工厂模式的类图如下所示。

通过这个Pizza店面的例子,差不多已经把工厂模式抽象工厂模式的主要思想已经讲解清楚了,至于具体实现的代码,可以参考《Head First设计模式》一书中的工厂模式章节。

参考资料:

  • 《Head First设计模式》