003.设计模式之Abstract Factory模式

 

场景:

飞机并不是有一个部件组成的, 而是由很多部件组成的, 现在我们假设所有飞机是由导航系统, 飞机引擎组成的.

那么不同的飞机就由不同的导航系统和飞机引擎组成的了.

对于飞机工厂, 生产一架飞机就是生产出飞机的导航系统和飞机引擎., 把它们组装在一起即可.

飞机的导航系统可以使飞机无人驾驶, 引擎用于产生飞机的动力.

现在有直升飞机(直升飞机导航系统 + 直升飞机引擎)当然由直升飞机工厂生产, 游泳飞机(游泳飞机导航系统, 游泳飞机引擎)当然由游泳飞机工厂生产.(对应的飞机只能由对应的导航系统和引擎组成, 如果把游泳飞机导航系统安装到直升飞机上, 小心挂掉.)

现在就是一个组合的问题了, 你要生产一架直升飞机, 首先当然就是要飞机导航系统和飞机引擎了, 而飞机导航系统和飞机引擎有分很多种. 而直升飞机就是由直升飞机导航系统和直升飞机引擎组成.

 

我们抽象时 抽象了飞机工厂, 同时抽象了飞机的各种部件.

那使用时, 创建对应的飞机工厂, 而对应的飞机工厂会创建对应的飞机部件.

角色

抽象工厂类(1个):定义创建不同类实例的多个接口;创建与管理子工厂对象,提供统一方法以取得不同的子工厂对象

子工厂类(多个):生成具体的类的实例

抽象产品类(多个):对产品的抽象

具有继承关系的具体的产品类(多个):继承自抽象产品类,它们之间一般存在或多或少的依耐关系

 

抽象飞机工厂 1个

具体飞机工厂 2个 直升飞机工厂和游泳飞机工厂

抽象部件 2个 抽象导航系统, 抽象引擎

具体部件 4个 直升飞机导航系统, 游泳飞机引擎, 游泳飞机导航系统, 游泳飞机引擎.

使用

我需要一架直升飞机, 我只要通知飞机总工厂, 飞机总工厂知道是生产直升飞机, 所以就使用通知直升飞机工厂生产. 直升飞机工厂当然知道自己要生产直升飞机导航系统和直升飞机引擎了.

可以发现, 我要一架直升飞机, 我并不需要知道直升飞机导航系统和直升飞机引擎是怎么生产的. 我只要向飞机总工厂说要直升飞机, 我甚至不需要知道直升飞机工厂的存在.

其实就是通过抽象飞机工厂, 抽象飞机部件,  我只需要知道有飞机工厂, 飞机(下图中的CHolicopter), 就可以使用飞机飞行了.

说明:

 11

 

代码:

// 调用

     CPlane* pPlane = new CHolicopter;         // 在这里是用户

 

     // 这里相当于通知总工厂, 我要一架直升飞机

     CHQPlaneFactory* pHQPlaneFactory = new CHolicopterFactory;      

 

     // 引擎

     pPlane->m_pEngine = pHQPlaneFactory->CreateEngine();

     // 导航系统

     pPlane->m_pNavigationSystem = pHQPlaneFactory->CreateNavigationSystem();

 

     // 引擎和导航系统都有了, 可以飞了

     pPlane->Fly();

 

     // 可以看到, 在使用的过程中, 用户根本没有接触到直升飞机引擎类和直升飞机导航系统类.

     // 该两个类在直升飞机工厂来调用创建

看工程003 AbstractFactory.rar

http://download.csdn.net/source/2824716

总结:

1.  Factory Method 模式的主要特点是通过工厂提供的方法生成类的对象,而具体的对象的生成工作被委让给(延迟到)子工厂,所以被称为工厂方法模式。

2. Abstract Factory模式与Factory Method很相似,都是通过工厂的方法生成目标类的对象,但它们之间的也存在一些区别。

3 . Abstract Factory模式与Factory Method模式的主要区别:

Factory Method采用的是工厂类继承机制(生成子工厂类,重载该工厂方法,在重载的方法中生成目标对象)。而Abstract Factory强调的是对象组合机制,由在父工厂内定义不同的“子工厂”对象来负责不同的目标对象的创建。

再深入一点理解:

Factory Method模式中,产品(目标对象)的使用者可能需要使用具体的子工厂来生成该产品;

Abstract Factory模式则采用传参数的形式直接在父工厂内决定该产品对象应该由哪一个子工厂生产。也就是说,Abstract Factory模式中,跟客户打交道的只有抽象工厂与抽象产品,客户不需要知道产品由哪个工厂生产,也不需要知道被生产的是哪一种具体的产品。

Factory Method模式中,生成的对象产品只限定于某一类产品;Abstract Factory模式则可以提供多个生产接口生成多类产品

Abstract Factory模式Factory Method模式的更高层次的抽象,也更最具一般性。

简单一点说,Abstract Factory模式通过抽象工厂为客户(调用者)生成多类产品,抽象工厂负责管理子工厂对象,子工厂负责生成某一类具体的产品对象。

项目应用

在我的热敏打印机例子中, 一般的热敏打印机是使用串口通信的, 但是有一些打印机是使用并口的, 甚至USB口, 更甚至是通过TCP/IP的, 越来越乱, 那我只能重新设计我的打印机类了.

我把打印机分为串口打印机, 并口打印机, 看下图:

 

 22

串口打印机工厂负责创建串口打印机, 并口打印机工厂负责创建并口打印机. 在串口打印机工厂中, 它知道为串口打印机创建串口, 在并口打印机工厂中, 它知道为并口打印机创建并口. 这个图好像有点熟. 我把图的摆放整理一下如下:

 

33

这不是Factory Method模式吗?  看看下面这个图:

 

44

Factory Method模式是Abstract Factory模式的特殊情况.

 

可以看到这3个图. 在Factory Method模式中, 打印机工厂是直接创建打印机的, 串口打印机工厂创建串口打印机, 而至于串口打印机里面是怎样的, 由什么组成, 串口打印机工厂并不关心.

而在Abstract Factory模式中, 打印机工厂并不是直接创建打印机, 而是创建打印机的部件, 具体的部件创建还交给具体的部件类. 这样打印机工厂就要关心打印机的组成了, 当各个打印机部件创建完成后, 一个打印机就创建成功了. 串口打印机工厂为串口打印机创建串口.

由于现在设计是打印机只由一个通信口组成, 所以创建了串口后, 一个串口打印机就创建完成了.

如此类推就有串口打印机, 并口打印机, USB打印机, TCP/IP的网络打印机, ...

其实现在也有一点问题出来了: 如果现在打印机的组成增加了一个部件, 则必须在串口打印机工厂, 并口打印机工厂, USB打印机工厂, TCP/IP的网络打印机工厂中增加这个部件的创建函数. 如果有100种打印机工厂, 那需要在这100个打印机工厂类中增加该部件的创建函数. 这是Abstract Factory模式的一个缺点.

引用:

http://www.cnblogs.com/reeezak/archive/2005/10/23/260493.html

http://www.lifevv.com/sysdesign/doc/20071109154018751.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值