the5fire

关注Python、Django、Vim、Linux、Web开发、团队管理和互联网--Life is short, we need Python.


重温设计模式之抽象工厂

作者:the5fire | 标签:     | 发布:2011-05-30 6:36 p.m. | 阅读量: 7089, 6978
上篇复习了工厂方法模式的使用,对于创建单个系列产品来说,工厂方法已经可以很好的满足“开-闭”原则,但是对于组合产品,由多系列组成的产品,就显得力不从心了。
工厂模式中工厂类得特点是职责单一,这也是工厂方法的优点,每个类不必要关联多种事务。但这种单一的特点也限制了工厂方法的扩展,使得每一个具体的工厂只能创建单一的产品。如果我们需要创建多个产品,那就需要修改抽象工厂或者具体工厂中的代码了。
因此,我们引入抽象工厂方法。
相对于工厂方法来说,抽象工厂只是多了一系列产品,并且抽象工厂类中的方法也不是针对单一的产品,而是针对对应型号,或者叫产品族。
举一个最简单的例子:商家到自行车厂,要求生产两种自行车,永久牌和飞鸽牌。由此我们写出一个抽象工厂的小实例(我们假设自行车只是由车架和轮胎构成),结构图如下:

具体流程很简单,自行车厂先找到其两个子工厂:飞鸽自行车厂和永久自行车厂,让他们各自生产自己的产品。
相应的子自行车厂找到对应的零件生产厂商,购买对应的零件,然后组成自行车。
其实这个里面可以加入建造者模式,为了保持简洁,这里暂时不引入建造者模式。
代码比较多,以附件形式提供吧。
点我下载抽象工厂源码
由这个简单的例子可以看得出来,抽象工厂在创建一类产品时是具有优势的,有很好的扩展性,比如增加一个Specialized牌得,只需要添加两个产品类和一个工厂即可,不需要修代码。
另外对于商家来说,我只需要知道我要什么自行车就行,其他的不需要关心。
但是问题是如果要添加脚蹬子这个产品怎么办?这确实是抽象工厂的一个缺点。我想后面我们可以通过其他模式来解决。

PS:抽象工厂官方定义:抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类- from the5fire.com
----EOF-----

微信公众号:Python程序员杂谈


其他分类: