创建型 中等

抽象工厂模式

Abstract Factory Pattern

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

概述

抽象工厂模式是一种创建型设计模式,它能创建一系列相关的对象,而无需指定其具体类。

适用场景

  • 当需要创建一系列相关的产品对象时
  • 当系统应该独立于产品的创建、组合和表示时
  • 当需要提供一个产品类库,只想显示它们的接口而不是实现时

优点

  • +确保同一工厂生成的产品属于同一系列
  • +避免客户端代码与具体产品代码的耦合
  • +单一职责原则:产品创建代码可以单独维护
  • +开闭原则:引入新产品系列时无需修改现有代码

缺点

  • 代码可能变得更加复杂,因为需要引入许多新的类和接口
  • 需要同时引入所有产品系列的变体

结构

classDiagram class GUIFactory { <<interface>> +createButton() Button +createCheckbox() Checkbox +createTextField() TextField } class WindowsFactory { +createButton() Button +createCheckbox() Checkbox +createTextField() TextField } class MacFactory { +createButton() Button +createCheckbox() Checkbox +createTextField() TextField } class LinuxFactory { +createButton() Button +createCheckbox() Checkbox +createTextField() TextField } class Button { <<interface>> +render() +onClick() } class Checkbox { <<interface>> +render() +toggle() } class TextField { <<interface>> +render() +setText(text) } class WindowsButton { +render() +onClick() } class WindowsCheckbox { +render() +toggle() } class WindowsTextField { +render() +setText(text) } class MacButton { +render() +onClick() } class MacCheckbox { +render() +toggle() } class MacTextField { +render() +setText(text) } class LinuxButton { +render() +onClick() } class LinuxCheckbox { +render() +toggle() } class LinuxTextField { +render() +setText(text) } class Application { -factory: GUIFactory -button: Button -checkbox: Checkbox -textField: TextField +createUI() +paint() } GUIFactory <|.. WindowsFactory GUIFactory <|.. MacFactory GUIFactory <|.. LinuxFactory Button <|.. WindowsButton Checkbox <|.. WindowsCheckbox TextField <|.. WindowsTextField Button <|.. MacButton Checkbox <|.. MacCheckbox TextField <|.. MacTextField Button <|.. LinuxButton Checkbox <|.. LinuxCheckbox TextField <|.. LinuxTextField WindowsFactory ..> WindowsButton : creates WindowsFactory ..> WindowsCheckbox : creates WindowsFactory ..> WindowsTextField : creates MacFactory ..> MacButton : creates MacFactory ..> MacCheckbox : creates MacFactory ..> MacTextField : creates LinuxFactory ..> LinuxButton : creates LinuxFactory ..> LinuxCheckbox : creates LinuxFactory ..> LinuxTextField : creates Application ..> GUIFactory : uses Application ..> Button : uses Application ..> Checkbox : uses Application ..> TextField : uses style GUIFactory fill:#e3f2fd,stroke:#1976d2,stroke-width:2px style Button fill:#fff3e0,stroke:#f57c00,stroke-width:1px style Checkbox fill:#fff3e0,stroke:#f57c00,stroke-width:1px style TextField fill:#fff3e0,stroke:#f57c00,stroke-width:1px style WindowsFactory fill:#e8f5e9,stroke:#388e3c,stroke-width:1px style MacFactory fill:#fce4ec,stroke:#c2185b,stroke-width:1px style LinuxFactory fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1px style Application fill:#f5f5f5,stroke:#616161,stroke-width:1px

交互演示

选择工厂创建完整的产品族
选择工厂
creates family
产品族
🪑 ProductChair
🛋️ ProductSofa
🪑 ProductTable

选择工厂,观察如何创建一系列风格一致的产品族

生活类比

抽象工厂就像是现实世界中的品牌家具店

品牌家具店

宜家提供现代风格的家具系列,红星美凯龙提供古典风格的家具系列。每个品牌就是一个抽象工厂,提供一系列相关的产品(沙发、桌子、椅子)。

代码实现

Example.java

实际应用

Java AWT/Swing

Java 的 GUI 工具包使用抽象工厂来创建跨平台的 UI 组件。

Example.java

练习

1

抽象工厂模式的主要目的是什么?