WHAT

定义

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。

类图

抽象工厂模式的通用类图

抽象工厂模式的通用源码类图

AbstractProductA

publci abstract class AbstractProductA {
  //每个产品共有的方法
  public void shareMethod(){
    
  }
  
  //每个产品相同方法,不同实现
  public abstruct void doSomething();
}

ProductA1

public class ProductA1 extends AbstractProductA {
  public void doSomething(){
    System.out.println("产品A1的实现方法");
  }
}

ProductA2

public class ProductA2 extends AbstractProductB {
  public void dosomething() {
    System.out.println("产品A2的实现方法");
  }
}

AbstractCreator

public abstract class AbstractCreator {
  // 创建A产品家族
  public abstract AbstractProductA createProductA();
  
  // 创建B产品家族
  public abstract AbstractProductsB createProductB();
}

Creator1

public class Creator1 extends AbstractCreator {
  //只生产产品等级为1的A产品
  public AbstractProductA creatProductA(){
    return new ProductA1();
  }
  
  // 只生产产品等级为1的B产品
  public AbstractProductB createProductB(){
    return new ProductB1();
  }
}

Creator2

public class Creator2 extends AbstractCreator {
  //只生产产品等级为2的A产品
  public AbstractProductA creatProductA(){
    return new ProductA2();
  }
  
  // 只生产产品等级为2的B产品
  public AbstractProductB createProductB(){
    return new ProductB2();
  }
}

WHY

优势

  • 封装性强。每个产品的实现类不是高层模块要关心的
  • 产品族内的约束未非公开状态

劣势

  • 产品族扩展困难
    • 违反了开闭原则

HOW

使用场景

一个对象族(或者一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式

注意事项

产品族扩展比较困难,不是产品等级扩展困难。产品等级扩展非常容易。

横向扩展容易,纵向扩展困难

最佳实践

涉及不同操作系统的时候,可以考虑用抽象工厂模式,例如一个应用,需要在三个不同平台上运行。通过抽象工厂模式屏蔽操作系统对应用的影响。


《设计模式之禅》第九章 抽象工厂模式