# Java設計模式中抽象工廠的定義及代碼演示
## 一、抽象工廠模式概述
### 1.1 模式定義
抽象工廠模式(Abstract Factory Pattern)是一種創建型設計模式,它提供了一種封裝一組具有共同主題的獨立工廠的方式,而無需指定它們的具體類。該模式允許客戶端使用抽象的接口來創建一系列相關或依賴對象,而無需關心實際創建的具體實現。
**核心特征**:
- 圍繞一個超級工廠創建其他工廠
- 工廠的工廠(Factory of factories)
- 生產相關對象族(產品家族)
### 1.2 模式結構
抽象工廠包含以下主要角色:
| 角色 | 說明 |
|---------------------|----------------------------------------------------------------------|
| AbstractFactory | 聲明創建抽象產品對象的操作接口 |
| ConcreteFactory | 實現創建具體產品對象的操作 |
| AbstractProduct | 為一類產品對象聲明接口 |
| ConcreteProduct | 定義將被具體工廠創建的產品對象,實現AbstractProduct接口 |
| Client | 僅使用由AbstractFactory和AbstractProduct類聲明的接口 |
### 1.3 適用場景
- 系統需要獨立于其產品的創建、組合和表示時
- 系統需要配置多個產品族中的一個來使用時
- 需要提供一個產品類庫,且只想顯示它們的接口而非實現時
- 一系列相關的產品對象設計為一起使用,且需要保證這一約束時
## 二、模式實現原理
### 2.1 UML類圖
```mermaid
classDiagram
class AbstractFactory {
<<interface>>
+createProductA() AbstractProductA
+createProductB() AbstractProductB
}
class ConcreteFactory1 {
+createProductA() AbstractProductA
+createProductB() AbstractProductB
}
class ConcreteFactory2 {
+createProductA() AbstractProductA
+createProductB() AbstractProductB
}
class AbstractProductA {
<<interface>>
+operationA() String
}
class ProductA1 {
+operationA() String
}
class ProductA2 {
+operationA() String
}
AbstractFactory <|-- ConcreteFactory1
AbstractFactory <|-- ConcreteFactory2
AbstractProductA <|-- ProductA1
AbstractProductA <|-- ProductA2
ConcreteFactory1 --> ProductA1
ConcreteFactory2 --> ProductA2
// 抽象產品接口
interface AbstractProductA {
String operationA();
}
interface AbstractProductB {
String operationB();
}
// 具體產品實現
class ConcreteProductA1 implements AbstractProductA {
public String operationA() {
return "Product A1 operation";
}
}
class ConcreteProductB1 implements AbstractProductB {
public String operationB() {
return "Product B1 operation";
}
}
// 抽象工廠接口
interface AbstractFactory {
AbstractProductA createProductA();
AbstractProductB createProductB();
}
// 具體工廠實現
class ConcreteFactory1 implements AbstractFactory {
public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}
假設我們需要開發一個跨平臺的UI組件庫,需要支持Windows和Mac兩種風格: - 按鈕(Button) - 文本框(TextField) - 復選框(Checkbox)
// 抽象產品接口
interface Button {
void render();
void onClick();
}
interface TextField {
void render();
String getText();
}
interface Checkbox {
void render();
boolean isChecked();
}
// Windows系列產品
class WindowsButton implements Button {
public void render() {
System.out.println("Render Windows style button");
}
public void onClick() {
System.out.println("Windows button clicked");
}
}
class WindowsTextField implements TextField {
public void render() {
System.out.println("Render Windows style text field");
}
public String getText() {
return "Windows text field content";
}
}
class WindowsCheckbox implements Checkbox {
public void render() {
System.out.println("Render Windows style checkbox");
}
public boolean isChecked() {
return true;
}
}
// Mac系列產品
class MacButton implements Button {
public void render() {
System.out.println("Render Mac style button");
}
public void onClick() {
System.out.println("Mac button clicked");
}
}
class MacTextField implements TextField {
public void render() {
System.out.println("Render Mac style text field");
}
public String getText() {
return "Mac text field content";
}
}
class MacCheckbox implements Checkbox {
public void render() {
System.out.println("Render Mac style checkbox");
}
public boolean isChecked() {
return false;
}
}
// 抽象工廠
interface GUIFactory {
Button createButton();
TextField createTextField();
Checkbox createCheckbox();
}
// 具體工廠
class WindowsFactory implements GUIFactory {
public Button createButton() {
return new WindowsButton();
}
public TextField createTextField() {
return new WindowsTextField();
}
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
class MacFactory implements GUIFactory {
public Button createButton() {
return new MacButton();
}
public TextField createTextField() {
return new MacTextField();
}
public Checkbox createCheckbox() {
return new MacCheckbox();
}
}
// 客戶端代碼
public class Application {
private Button button;
private TextField textField;
private Checkbox checkbox;
public Application(GUIFactory factory) {
button = factory.createButton();
textField = factory.createTextField();
checkbox = factory.createCheckbox();
}
public void renderUI() {
button.render();
textField.render();
checkbox.render();
}
public static void main(String[] args) {
// 根據配置選擇工廠
GUIFactory factory;
String osName = System.getProperty("os.name").toLowerCase();
if (osName.contains("win")) {
factory = new WindowsFactory();
} else {
factory = new MacFactory();
}
Application app = new Application(factory);
app.renderUI();
}
}
當在Windows系統運行時輸出:
Render Windows style button
Render Windows style text field
Render Windows style checkbox
當在Mac系統運行時輸出:
Render Mac style button
Render Mac style text field
Render Mac style checkbox
與工廠方法模式:
與單例模式:
與原型模式:
Java標準庫中的應用:
流行框架中的應用:
跨平臺開發:
抽象工廠模式通過提供創建相關或依賴對象族的接口,實現了: - 系統與具體產品實現的解耦 - 產品配置的靈活性 - 多系列產品的統一創建
正確使用該模式的關鍵在于識別系統中是否存在多個產品族,以及是否需要保證產品間的兼容性。當產品等級結構穩定時,抽象工廠模式能顯著提高代碼的可維護性和擴展性。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。