Provide a interface for creating families of related or dependent objects without specifing their concrete classess.

我的翻译:提供一个接口用来定义一系列有共同相关性的或互相依赖的对象,但不用指定具体的实现类。

通用UML图

抽象工厂模式的优点

  • 良好的封装性,每个产品的实现类不是高层模块所要关心的,高层模块只需要关心接口,抽象。每个具体产品是由每个具体工厂实现类创建的。只要知道工厂类是谁就能创建具体对象。
  • 具体工厂类在创建产品族或者一类产品(object)的时候,可以对这类产品的生产做具体细节上的控制,

抽象工厂模式的缺点

抽象工厂模式最大的缺点就是扩展产品族非常困难。有多少个产品族就要创建多少个产品实现类,还要修改工厂方法,违法开闭原则

抽象工厂模式UML

image

具体应用举例

女王造人的例子,女娲可以造出不同肤色的人种,白色,黄色。每个人种都是有性别的,男和女。
image

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

在抽象工厂模式的缺点中,我们提到抽象工厂模式的产品族扩展比较困难,但是一定要
清楚,是产品族扩展困难,而不是产品等级。在该模式下,产品等级是非常容易扩展的,增
加一个产品等级,只要增加一个工厂类负责新增加出来的产品生产任务即可。也就是说横向
扩展容易,纵向扩展困难。以人类为例子,产品等级中只有男、女两个性别,现实世界还有
一种性别:双性人,既是男人也是女人(俗语就是阴阳人),那我们要扩展这个产品等级也
是非常容易的,增加三个产品类,分别对应不同的肤色,然后再创建一个工厂类,专门负责
不同肤色人的双性人的创建任务,完全通过扩展来实现需求的变更,从这一点上看,抽象工
厂模式是符合开闭原则的。

代码

download