设计模式之工厂模式(美食篇)

本文我打算聊一聊我所理解的简单工厂模式、工厂模式和抽象工厂模式。同样身为工厂模式的三种模式,他们有什么不同呢?

此刻,作为一个不资深吃货的我,就用生活中的美食来类比一下它们吧。

你一定很好奇工厂模式怎么还能说出来吃的呢?哈哈,那咱们就拭目以待咯。

手动实现

咱们在聊设计模式之前,都应该思考一个问题:是先有设计模式,还是先有适用的业务场景?

听起来像是在问“先有鸡,还是先有蛋”一样的问题。不过,这和鸡蛋的问题的不同,鸡蛋的问题我个人是分不清了,不过刚刚提出的这个问题是可以有定论的:一定是先有业务场景的。

就像筷子勺子叉子,它们是为了方便我们吃饭而生的,没有它们我们一样是可以用手吃饭的,虽然有点不雅(嘿嘿)。设计模式就是类似筷子一样的工具,有了会更好,没有我们也不会饿死。

那么,咱们先来看一下,没有“筷子”的我是怎么享受“美食”的。

自己动手,丰衣足食.png

看到了吧,我必须要自己做一个烤冷面出来(也就是类的实例化),然后才能享用。每次享受美食之前,还要自己动手做,实在是太麻烦了。

不过呢,这里我小小的思考了一下,把设计模式当作筷子似乎不妥,因为筷子是为了方便我们吃饭的。但是从这个代码可以看出来,设计模式在这里的作用不仅仅这么简单,它可能更像是我们的高压锅、豆浆机。

那么,接下来就看一下它是不是真的有这么神奇。

简单工厂模式

简单工厂(Simple Factory),顾名思义,就是结构简单的工厂模式,有多简单呢?简单地就像是一家有各种美食的小饭馆,比如:深夜食堂。

加班太晚了,饭店都关门了,外卖也没有了。怎么办呢?那就去深夜食堂走一遭吧!

进店,空间不算很大,但是老板手艺很好!

我:老板,来份烤冷面,再加一个蛋堡!

老板:好的,稍等!

不一会,老板就把刚出锅的美食端到了我的面前。

还等什么呢,我是一顿的狼吞虎咽啊~~

吃饱喝足了,打道回府!

深夜食堂这样的小饭馆就是简单工厂。

你不需要懂得怎么做,只要照着菜单或者随便点,老板会做的都可以给你做。

好处就是,不用自己做饭了,咱们下馆子!yohohoho~~

下面我们来看一下实现代码:

简单工厂.png

工厂模式

工厂模式(Factory Pattern)是对深夜食堂这些小饭馆的规范化。

深夜食堂的菜单点餐虽然很好,但是所有的美食都是老板自己做,效率不高。顾客多了,还要排队等着。

好在我发现了新去处:青岛的台东步行街。

我又一次来到了青岛的台东步行街,这里有着最火爆的夜市,最美味的小吃。特别讨厌走街串巷的我,一到了这里,仿佛就变了一个人似的,除了那条长长的小吃街以外,我还发现了很多小巷子里的美食。简直口水流到爆!

我掏出人民币,买了一份网红烤冷面,一个最爱吃的炸串卷饼,然后再来一杯会冒泡的饮料,再点个烤生蚝……

好了,吃饱了!果然不虚此行啊!

这里我们就看到了一个生活中的工厂模式。

不同的商家代表了不同的工厂,我们可以通过逛吃逛吃的方式,看上哪家的美食,就买哪家的美食。

老规矩,代码码起来:

工厂模式.png

抽象工厂模式

抽象工厂(Abstract Factory)是对工厂模式的抽象。

回想刚才的台东美食之旅有什么不好的地方呢?

吃东西是挺方便的,但是我想要买到我想要的美食,我必须要不停的逛啊找啊。我要知道商家的位置(选择调用哪种工厂),这样又费时又费力,还有可能找错。不懂海鲜的我,很有可能买烤生蚝错买成了烤海胆。

抽象工厂就可以解决这种问题。

还是深夜食堂,因为之前生意火爆,老板也知道小饭馆规模受限了。所以投资在全国各地开分店了。店面非常气派,进去以后,所有的美食应有尽有。

只见我喜欢的烤冷面、蛋堡、炸串卷饼……都有序的摆着,旁边还注明每种美食的名称。

因为跟老板很熟,所以老板热情地邀请我去后厨参观。

进了后厨,我惊呆了!一切都井井有条!

大厨们分工明确,几个做烤冷面的,几个做蛋堡的,几个做烤生蚝的等等等等。

这些事情,在我买美食的时候,我是完全不知道的。我只管享用我的美食就好了。

这种体验太棒了!必须给老板点个赞!

吃吃喝喝,再和老板叙叙旧,最后心满意足的离开了!

抽象工厂最大的好处就是完美的实现了开闭原则。就像井然有序的后厨,你想吃烤冷面,你得到的就一定是烤冷面。至于它怎么被生产出来的,经过了几个人的加工,后厨的大师傅是不是换了,完全不需要关心。而且,我不需要担心自己买生蚝买成海胆了。

  • 下面插播一条小剧场

有朋友在《设计模式之禅》书中看到下面的一段话:


设计模式之禅.png

那么,我们刚才所说的保证了开闭原则是不是理解错了呢?

……

和小伙伴们经过一番交流后……

结论:

上文提到的抽象模式保证了开闭原则,这个说法是没有问题的。当然开闭原则也是相对而言的,上文提到的开闭原则是指新增产品种类的情况,也就是说再加一个产品——“卷饼”,对抽象工厂而言只是新增种类而已,而不会影响原有的烤冷面和蛋堡。

但此时如果扩充现有美食自身的种类,就会违反开闭原则。比如:在现有烤冷面的番茄味、酸甜味的基础上,新增一种香辣味的烤冷面,我们就不得不修改原有烤冷面的方法。很明显,此时,我们就违反了开闭原则。

因此,我那机智的小伙伴也想到了这种情况的解决办法:继承

对于抽象工厂而言,最好是保留共性的属性,定制化的属性通过继承来实现。

这一观点也在《设计模式之禅》一书的后续提到:


设计模式之禅.png

好的,再来一起看一下代码实现:

抽象工厂.png

小结

相信大家阅读本文以后,一定对这三种模式有了更深的理解!据我所知,简单工厂分工不明确,对于咱们很需要分工合作的职场生涯是很差的体验。而有逼格的程序猿一定要把项目设计的井井有条,你做烤冷面,我做蛋堡……所以,工厂模式和抽象工厂模式一定得熟练运用。

在实际运用中,设计模式经常会组合使用,根据不同的业务场景选择设计模式。摘掉设计模式的神秘面纱,它其实是很平易近人的,生活中的它可是无处不在的。

此外,本文的代码都没有注释,是因为文章里不太希望代码的篇幅占的太多,所以很多有趣的注释都去掉了。但是代码注释是很重要的!注释可以提高代码的可维护性,实际编写程序是一定要添加代码注释的!

当然,如果客官对这次美食之旅感兴趣,欢迎到我的GitHub上浏览一下别具一番风味的注释!

你可能感兴趣的:(设计模式之工厂模式(美食篇))