CHARLIE SAYS

查理如是说
DATE 2026-08-24
THEME
SERIES / DESIGN_PATTERNS / P-099 · 设计模式

设计模式 005:抽象工厂(Abstract Factory)

意图

提供一个接口,用于创建相关的对象家族

类图

抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,必须一起创建出来。而工厂方法模式只是用于创建一个对象,这是两者的很大不同。

classDiagram
    class AbstractFactory {
        <<abstract>>
        +createProductA()* AbstractProductA
        +createProductB()* AbstractProductB
    }
    class ConcreteFactory1 {
        +createProductA() AbstractProductA
        +createProductB() AbstractProductB
    }
    class ConcreteFactory2 {
        +createProductA() AbstractProductA
        +createProductB() AbstractProductB
    }
    class AbstractProductA
    class AbstractProductB
    class ProductA1
    class ProductA2
    class ProductB1
    class ProductB2
    AbstractFactory <|-- ConcreteFactory1
    AbstractFactory <|-- ConcreteFactory2
    AbstractProductA <|-- ProductA1
    AbstractProductA <|-- ProductA2
    AbstractProductB <|-- ProductB1
    AbstractProductB <|-- ProductB2
    ConcreteFactory1 ..> ProductA1 : 创建
    ConcreteFactory1 ..> ProductB1 : 创建
    ConcreteFactory2 ..> ProductA2 : 创建
    ConcreteFactory2 ..> ProductB2 : 创建

两个视角理解这个模式:

  • 抽象工厂模式用到了工厂方法模式来创建单一对象:AbstractFactory 中的 createProductA()createProductB() 方法都是让子类来实现,这两个方法单独来看就是在创建一个对象,符合工厂方法模式的定义
  • 至于”创建对象的家族”这一概念是在 Client 体现:Client 要通过 AbstractFactory 同时调用两个方法来创建出两个对象,这两个对象有很大的相关性,Client 需要同时创建出这两个对象
  • 从高层次来看,抽象工厂使用了组合(Client 组合了 AbstractFactory),而工厂方法模式使用了继承

代码实现

public class AbstractProductA {
}

public class AbstractProductB {
}

public class ProductA1 extends AbstractProductA {
}

public class ProductA2 extends AbstractProductA {
}

public class ProductB1 extends AbstractProductB {
}

public class ProductB2 extends AbstractProductB {
}
public abstract class AbstractFactory {
    abstract AbstractProductA createProductA();
    abstract AbstractProductB createProductB();
}

public class ConcreteFactory1 extends AbstractFactory {
    AbstractProductA createProductA() {
        return new ProductA1();
    }

    AbstractProductB createProductB() {
        return new ProductB1();
    }
}

public class ConcreteFactory2 extends AbstractFactory {
    AbstractProductA createProductA() {
        return new ProductA2();
    }

    AbstractProductB createProductB() {
        return new ProductB2();
    }
}
public class Client {
    public static void main(String[] args) {
        AbstractFactory abstractFactory = new ConcreteFactory1();
        AbstractProductA productA = abstractFactory.createProductA();
        AbstractProductB productB = abstractFactory.createProductB();
        // do something with productA and productB
    }
}

JDK 中的应用

  • javax.xml.parsers.DocumentBuilderFactory
  • javax.xml.transform.TransformerFactory
  • javax.xml.xpath.XPathFactory

工厂三兄弟对比

简单工厂工厂方法抽象工厂
创建的产品单一产品(分支选择)单一产品(子类决定)对象家族(多个相关产品)
工厂结构一个工厂类工厂抽象父类 + 子类工厂工厂抽象父类 + 子类工厂,每个工厂多个创建方法
扩展方式修改工厂分支新增工厂子类新增工厂子类;新增产品等级结构需改抽象工厂接口

总结

读完之后问自己下面几个问题,直到可以流利地回答:

  • 使用的场景?
  • 本质是什么?
  • 它解决了什么问题?
  • 它体现了设计模式中什么原则?
  • 存在的缺陷?
  • 你认为与它相关的设计模式有哪些?它们之间的区别有哪些?
  • 开源架构中哪些使用了这一模式?

系列导航

参考

← 开源合规 005:知识共享许可协议文本 目录 软件工程 005:微服务:康威定律 →
← 返回文章列表