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