设计模式(03) 抽象工厂模式(下)

来源:互联网 发布:linux中cd命令 编辑:程序博客网 时间:2024/06/04 00:24

From Now On,Let us begin Design Patterns。

抽象工厂模式

定义

  • 抽象工厂模式(AbstractFactory Pattern) 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。Provide an interface ofr creating families of related or dependentobjects without specifying their concrete class.

抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

抽象工厂模式的优点:

  • 封装性,每个产品的实现类不是高层模块要关心的,它要关心的是:接口,抽象,它不关心对象是如何创建出来的,这是由工厂类创建的,只要知道工厂类是谁,我就能创建出一个需要的对象,省时省力。

  • * 产品族内的约束为非公开状态。在抽象工厂模式中应该有这样一个约束:约束不同等级产品的生产比例。而这样的生产过程对调用工厂类的高层模式来说是透明的,它不需要知道这个约束,它就是要一个这样的产品,具体的产品族内的约束是在工厂内实现的。*

抽象工厂模式的缺点:

  • 最大缺点:产品族扩展非常困难。例如:如果要增加一个产品C,也就是产品家族由原来的2个增加到3个,我们的程序将会大大改动:抽象类要增加一个方法,然后两个实现类都要修改,这严重违反了开闭原则,而且我们一直说明抽象类和接口是一个契约。而这段代码却显然是“有毒代码”。

抽象工厂模式的使用场景:

使用场景定义非常简单:一个对象簇(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。

抽象工厂模式的实现方法:

抽象工厂模式:
我们接着上一个例子

随着客户的要求越来越高,奔馳车需要不同配置的空调和发动机等配件。于是这个工厂开始生产空调和发动机,用来组装汽车。这时候工厂有两个系列的产品:空调和发动机。奔驰E级轿车“普通”空调和“低功耗”发动机,奔驰S级轿车配置“高级”空调和“高性能”发动机。

抽象工厂模式:给不同系列的奔驰车不同配置

我们开始给不同的系列装配不同的发动机跟空调:
这里写图片描述

源代码如下:

发动机和空调等配件产品:
这里写图片描述

工厂职能:
这里写图片描述
因为增加了空调跟发动机,也就是产品家族由原来的1个增加到3个,我们的程序将会大大改动:抽象类(BenzFactory)要增加两个方法,然后3个实现类都要修改,这严重违反了开闭原则,而且我们一直说明抽象类和接口是一个契约。而这段代码却显然是“有毒代码”。而且汽车缺少装配的过程。。。。。为了方便阅读,我们减少了“超级跑车的建造过程”

工厂职能:(修改后):
这里写图片描述

汽车分类:
这里写图片描述

顾客买车:
这里写图片描述

买车结果:
这里写图片描述
到此为止:我们完成了抽象工厂模式的说明。

总结:
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。

原创粉丝点击