设计模式中几个工厂模式的比较——餐馆的故事
初读 Learning Hard大神的作品(C#设计模式总结 - Learning hard - 博客园),略有感触。对创建型模式中的简单工厂模式、工厂方法模式和抽象工厂模式这三个既有共性又有区别的模式加以比较,想出了一则生动有趣的故事以比喻之。在此与大家分享。
最初,在小城里还没有餐馆,人们只能自己动手做饭吃。而自己做饭不专业,也没有效率,也麻烦。正如没有任何工厂类的时候,客户端只能自己去创建类,每个不同的客户端都这么创建类,自然就有很多重复的代码,而且容易出错。
之后小城里有了餐馆,人们只要进去点菜,就可以吃到自己想要的菜。这个餐馆就是一个简单工厂类,客户端只要传进去一个参数表示自己想要的类,简单工厂就会返回这个类,这样客户端就轻松很多。
随着餐馆的生意越来越好,来小城的食客也越来越多,食客要求的菜品也越来越多有要川菜、粤菜、鲁菜等等,餐馆不得不去招聘各种各样的厨师来满足这些需求。然而,样样精,就是样样都不精。正如餐馆出现之前,人们自己做饭,不专业、没效率、麻烦,一个包罗杂七杂八厨师的餐馆也必然是不专业、没效率、混乱。正如一个简单工厂类,当其需要产出的产品类过多时,其内部结构也会复杂混乱。
这个时候,小城里陆续有了其他餐馆。没错!他们继承自餐馆,但是它们是川菜馆、粤菜馆、鲁菜馆等。这个时候食客们发现这些新餐馆比原来的那个老餐馆更加专业,只做一个菜系。因此这些新餐馆变得更受欢迎。更可喜的是即使有一些老外慕名来到小城,他们也可以去街上新开的那家KFC而不会影响到其他餐馆。这就是工厂方法模式带来的好处,一个抽象工厂随时可以按照客户端的需求去实现一个新的工厂类来产生新的产品类来满足客户端新的要求。
在小城里的一群老陕,最爱吃一家凉皮店的肉夹馍+凉皮+冰峰,因为这个组合有凉有热、有吃有喝、有肉有菜。这天他们决定换换口味,去了家川菜馆。拿到菜单之后,他们傻了眼,虽然可以想点哪个点哪个,但是他们并不清楚这些菜是用什么原料,是什么味道。最后瞎点一通,吃完不欢而散。即使他们可以咨询其他人和店老板,对他们来说也比较麻烦是一种负担。正如工厂方法模式可以按客户端需求去创造产品类,但是还需要客户自己去识别要产生哪些类,还要确定这些类的关系,甚是麻烦。
为了解决这一问题,小城的餐馆老板们聚在一起,根据各自的拿手好菜,讨论抽象出了一个人人都爱的食物模式:有凉有热、有吃有喝、有肉有菜。按照这个标准每家餐馆都制定了自己的套餐来满足这个标准。这下食客们可幸福了,他们只要选择一家自己想要的餐馆进去,就可以享受到满足最佳食物模式的套餐,而不必纠结于具体点什么。这就是抽象工厂模式的好处,抽象工厂定义出了一个产品族及其关系以满足客户需求,那么按照这个定义出来的产品一定会满足客户端的需要。而客户端只需要选择一个产品族就可以,轻松愉快!