如何让孩子爱上设计模式 —— 6.抽象工厂模式(Abstract Factory Pattern)
标签: 设计模式初涉
描述性文字
上节通过小猪开奶茶店的例子引入了简单工厂模式与工厂方法模式,
本节我们来继续通过这个例子引出抽象工厂模式!小猪的奶茶店开
了也有一段时间了,吃货们对奶茶都很满意,更多的反馈是太单调
如果能搭配其他的小吃,比如手抓饼,咖喱鱼蛋啥的就更好了,
小猪通过自学学会了很多小吃制作方法,思考好久后,决定
升级小猪奶茶店,只是想增加新的小吃类,按照奶茶的套路,
又抽取做小吃的套路,再去请几个小弟专门负责做小吃显然
有些繁琐,而且要另外花钱,还不如让两个做奶茶的小弟都学
会做小吃,说多无益,开始升级小猪奶茶店!
升级小猪奶茶店 2.0
首先是产品类,我们有两个系列的产品,一个是饮料类,一个是小吃类
然后饮料有奶茶类和果汁类,小吃有手抓饼类和鱼蛋类
再接着我们把做做奶茶和做小吃的套路抽取成制作食物类
然后让两个小弟类来继承这个套路,比如让小弟1负责做奶茶和手抓饼,
而小弟2负责做果汁和鱼丸:
东西都教好了,接着就开门做生意咯,现在的流程变成了这样:
处理了四单,结果如下:
好的,以上就是本节抽象工厂的代码示例!你可能会说:
蛤!就这么简单?实际上就是这么简单,当然,看完这
个代码只是说明你理解了这个模式大概是怎样的,灵活
运用还需多多实现,栗子看懂了,替换成一些名词,
就不难理解了!
两个名词(产品等级结构与产品族)
产品等级结构(继承):
产品的继承结构,比如这里的抽象类是Drink(饮料),子类有
奶茶,果汁,然后抽象饮料与具体饮料构成了一个产品等级
结构,抽象饮料是父类,具体饮料是其子类。
产品族
同一工厂生产的,位于不同产品等级结构的一组产品,比如这里
的奶茶和果汁属于饮料结构的一组产品,而手抓饼和鱼蛋则
属于小吃结构的一组产品。
UML类图
如图所示,抽象工厂模式就是由四个角色组成:
- 抽象工厂:声明一组用于创建产品族的方法,每个方法对应一种产品;
- 具体工厂:实现抽象工厂创建产品的方法,生成具体产品;
- 抽象产品:为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法;
- 具体产品:抽象产品的具体化,实现抽象产品的相关方法;
使用场景与优缺点
使用场景
创建的对象有多个相互关联或依赖的产品族
优点
- 1.隔离具体类的生成,客户端无需知道怎么被创建,接口与实现分离
- 2.增加新的产品族很方便,无须修改已有系统,符合”开闭原则”
缺点:
- 1.类文件增加
- 2.扩展新的产品等级结构麻烦,需要修改抽象工厂,实现抽象工厂的
具体工厂类都要更改!
本节代码
https://github.com/coder-pig/DesignPatternsExample/tree/master/5.Abstract%20Factory%20Pattern