转自:能让面试官满意的:你对工厂模式的理解?
工厂模式是面向对象编程中常用的设计模式之一,它用于处理对象的创建。工厂模式隐藏了对象创建的复杂性,通过使用一个共同的接口来指向新创建的对象。
一、简单工厂模式
想象这样一个业务场景:一个生产食物的工厂类(FoodFactory),该工厂需要根据消费者的不同需求去生产不同的食物(面条noodle、鸡肉chicken),那么简单工厂模式就产生了,看代码(对照这段描述):
noodle和chicken都继承自食物类food(派生关系)
这样简单工厂模式就实现了,总结一下:一个工厂类(XxxFactory),提供一个生产的方法(makeXxxx),根据消费者的不同需求(入参name)创建不同类型的食物对象(noodle/chicken)。
二、工厂模式
对于单个工厂来说,简单工厂模式足够支撑。不过涉及到多个工厂的话,就需要工厂模式了。
基于之前的业务场景,试想一下,客户需要对食物做分类了:中餐、西餐。那么这个时候就产生了两个工厂的需求(ChineseFoodFactory和WesternFoodFactory),上代码:
这里以noodle和chicken结尾的类都继承自食物类food(派生关系)
是的,你是否觉得有点眼熟(如果你已经理解了简单工厂模式,你应该发现了这是两个简单工厂模式。如果你没发现的话,请回到简单工厂模式重新理解一次)。好的,修改一下代码,工厂模式实现:
注:更改的部分已经标了出来,实际上是做了一个接口,把工厂的实例化作了抽象,这是工厂模式的关键思想
调用代码:
看到这里,其实读者应该已经大概理解,工厂模式是在简单工厂的基础上,将具体工厂的实例化作抽象选择。
我在文章开头提到过,读者想要有所收获的前提是:坚持看完,如果你已经看到了这里,说明你理解了这个前提,go on!
三、抽象工厂模式
引用一个经典例子:制造一台电脑
CPU、主板、内存......一种配件就需要一个工厂,如果读者已经理解了前面讲的工厂模式,那么你现在脑海里应该已经有了一个大概的思路,再体会一下这个过程,其实这就是设计模式为你带来的提升。如果没有的话,请回到前面再看一遍。让我来猜一下你的思路(拿cpu来举例):
将各个配件工厂组装成电脑:
写到这里,工厂模式的问题就产生了:试想一下,如果内存和主板型号不兼容,那么将导致电脑不可用,bug就产生了。
想解决兼容问题,就需要舍弃客户自由选择工厂对象的权力,并指定各个工厂生产的对象做一个固定的组合(产品族,产品族的说明图我放在了最下面),这就是抽象工厂模式的设计思路,看代码:
总结一下抽象工厂模式:抽象工厂模式舍弃了多配件工厂的概念,创建了产品族工厂(产品族工厂可以按照不同的标准区分,本文采用品牌做区分IntelFactory、AmdFactory)来封装各个配件的选择和创建过程,这样就不需要客户自己选择配件,也就解决了兼容问题。