您的位置:首页 > 其它

【模式】抽象工厂模式

2007-08-13 00:07 141 查看
天跟漏了似的,下了一整天的雨,本来打算和小小去看电影来着,结果被困在家里,哪都去不了~

工厂模式看了好几遍,但是还是总把抽象工厂和工厂方法弄混,blog下来让自己有点记性。
工厂模式解决这样的问题:
需要为特定的“客户”提供特定系列的对象,这样一系列相关对象需要被实例化,我们有需要判断在情况A时,实例化对象a;在情况B,实例化对象b。类型A和B很相似,拥有相似的接口,而且完成相似的功能,只不过具体实现有差别——a对象属于A系列中的一种,b对象属于B系列中的一种。A系列有a1对象可以解决C这样的问题,B系列有b1对象也可以解决C问题;A系列有a2可以解决D问题,B系列也有b2可以解决D问题。一种可能的解决办法是用switch-case结构,但是这会造成维护时的负担,扩展性也不好,既要判断是哪种问题,又要判断要用哪种系列。用抽象工厂可以解决这样的问题。
Abstract Factory模式通过一个抽象类,来指定那些对象将被创建,然后为每一系列对象实现一个具体类。有这些具体类来做实际的工作。这样会对“客户”隐藏具体使用了什么对象,是对象A还是对象B,客户并不了解,客户只需要提供需求,然后由那个抽象类来决定用那种具体类。
过程是这样的:
需要一个显卡驱动
1. 客户---------------------------------------------->对象工厂
|
| 创建一个ATI显卡驱动
|
ATI系列
给客户一个显卡驱动
2. 客户<----------------------------------------------对象工厂

ATI系列

3. 客户 对象工厂
|
| 使用这个ATI显卡驱动
|
|-------------------------------------------------> ATI系列
需要一个主板驱动
4. 客户---------------------------------------------->对象工厂
|
| 创建一个ATI主板驱动
|
ATI系列
给客户一个主板驱动
5. 客户<----------------------------------------------对象工厂

ATI系列

6. 客户 对象工厂
|
| 使用这个ATI主板和显卡驱动
|
|-------------------------------------------------> ATI系列

以上其实是一般情况,更隔路的情况在于,客户需要一个Intel主板驱动和一个ATI显卡驱动,那么我们就需要拜托工厂给我们做成这样:(只有4~6,1~3一样)
需要一个主板驱动
4. 客户---------------------------------------------->对象工厂
|
| 创建一个Intel主板驱动
|
Intel系列
给客户一个主板驱动
5. 客户<----------------------------------------------对象工厂

Intel系列

6. 客户 对象工厂
| 使用Intel主板驱动
| ------------------------------------------------>Intel系列
| 使用ATI显卡驱动
|-------------------------------------------------> ATI系列

当问题领域中有不同系列(Intel和ATI)的对象出现,并且每个系列都将被用于不同情况时(又有显卡驱动又有主板驱动),就应该使用Abstract Factory模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: