创建型 中等
抽象工厂模式
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