java与模式 抽象工厂(Abstract Factory)

来源:互联网 发布:噪音分析软件 编辑:程序博客网 时间:2024/05/22 21:04

抽象工厂模式可以向客户端提供一个接口,使客户端在不必制定产品的具体类型的情况下,创建多个产品族中的产品对象。其关键在于可以用于创建多个产品族,而这些产品族是不能抽象成一个一个接口或者抽象类。

"抽象工厂"这个名字,"抽象"来自"抽象产品角色",而"抽象工厂"就是抽象产品角色的工厂。

采用抽象工厂模式设计出的系统类图如下所示:

在以下情况下应该考虑使用抽象工厂模式:

  • 一个系统不应该依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
  • 这个系统的产品有多余一个的产品族,而系统只消费其中某一族的产品。(这一点跟抽象工厂的起源相关,现代的应用中,不再要求系统只能消费同一个产品族的产品)
  • 同属于同一个产品族的产品是在一起时用的,这一约束必须在系统的设计中体现出来。
  • 西通提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

开-闭原则要求一个软件系统在不修改原有代码的情况下,通过扩展达到增强功能的目的。与iyuyige设计到多个产品等级结构和多个产品族的系统,其功能的增强无外乎是增加新的产品族,和增加新的等级结构。

  • 增加新的产品族,只需要在每个产品等级结构中增加新的具体产品角色。然后加入新的具体工厂就可以了。
  • 增加新的产品等级结构,需要多出一个与现有的产品等级结构平行的新的产品等级结构。而且需要给每个工厂类添加新的工厂方法,而这是违背"开-闭"原则的。
  • 综合起来,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。

相关模式:

  • 抽象工厂模式中,在某些情况下具体工厂类可以设计成单例类。
  • 在简单工厂模式中,提到工厂角色可以与抽象产品角色合并,在抽象工厂模式中,可以在抽象工厂中添加静态方法,来生成具体工厂的实例。