# Java如何實現抽象工廠模式
## 1. 模式概述
### 1.1 定義
抽象工廠模式(Abstract Factory Pattern)是一種創建型設計模式,它提供了一種封裝一組具有共同主題的獨立工廠的方式,而無需指定它們的具體類。該模式允許客戶端使用抽象的接口來創建一組相關或依賴對象,而無需關心實際創建的具體對象是什么。
### 1.2 核心角色
- **抽象工廠(AbstractFactory)**:聲明創建抽象產品對象的接口
- **具體工廠(ConcreteFactory)**:實現抽象工廠的接口,負責創建具體產品對象
- **抽象產品(AbstractProduct)**:聲明產品對象的接口
- **具體產品(ConcreteProduct)**:實現抽象產品接口的具體類
- **客戶端(Client)**:使用抽象工廠和抽象產品接口
## 2. 模式結構
```java
// 抽象產品A
interface ProductA {
void operationA();
}
// 抽象產品B
interface ProductB {
void operationB();
}
// 具體產品A1
class ConcreteProductA1 implements ProductA {
public void operationA() {
System.out.println("ConcreteProductA1 operation");
}
}
// 具體產品B1
class ConcreteProductB1 implements ProductB {
public void operationB() {
System.out.println("ConcreteProductB1 operation");
}
}
// 抽象工廠
interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
// 具體工廠1
class ConcreteFactory1 implements AbstractFactory {
public ProductA createProductA() {
return new ConcreteProductA1();
}
public ProductB createProductB() {
return new ConcreteProductB1();
}
}
// 抽象按鈕
interface Button {
void render();
void onClick();
}
// Windows按鈕
class WindowsButton implements Button {
public void render() {
System.out.println("Render Windows style button");
}
public void onClick() {
System.out.println("Windows button clicked");
}
}
// MacOS按鈕
class MacOSButton implements Button {
public void render() {
System.out.println("Render MacOS style button");
}
public void onClick() {
System.out.println("MacOS button clicked");
}
}
// 抽象復選框
interface Checkbox {
void render();
void toggle();
}
// Windows復選框
class WindowsCheckbox implements Checkbox {
public void render() {
System.out.println("Render Windows style checkbox");
}
public void toggle() {
System.out.println("Windows checkbox toggled");
}
}
// MacOS復選框
class MacOSCheckbox implements Checkbox {
public void render() {
System.out.println("Render MacOS style checkbox");
}
public void toggle() {
System.out.println("MacOS checkbox toggled");
}
}
// 抽象GUI工廠
interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
// Windows工廠
class WindowsFactory implements GUIFactory {
public Button createButton() {
return new WindowsButton();
}
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
// MacOS工廠
class MacOSFactory implements GUIFactory {
public Button createButton() {
return new MacOSButton();
}
public Checkbox createCheckbox() {
return new MacOSCheckbox();
}
}
// 客戶端代碼
class Application {
private Button button;
private Checkbox checkbox;
public Application(GUIFactory factory) {
button = factory.createButton();
checkbox = factory.createCheckbox();
}
public void render() {
button.render();
checkbox.render();
}
}
// 使用示例
public class AbstractFactoryDemo {
public static void main(String[] args) {
// 創建Windows風格UI
GUIFactory windowsFactory = new WindowsFactory();
Application windowsApp = new Application(windowsFactory);
windowsApp.render();
// 創建MacOS風格UI
GUIFactory macFactory = new MacOSFactory();
Application macApp = new Application(macFactory);
macApp.render();
}
}
// 抽象連接
interface Connection {
void connect();
void executeQuery(String query);
}
// MySQL連接
class MySQLConnection implements Connection {
public void connect() {
System.out.println("Connected to MySQL database");
}
public void executeQuery(String query) {
System.out.println("Executing MySQL query: " + query);
}
}
// Oracle連接
class OracleConnection implements Connection {
public void connect() {
System.out.println("Connected to Oracle database");
}
public void executeQuery(String query) {
System.out.println("Executing Oracle query: " + query);
}
}
// 抽象語句
interface Statement {
void prepare();
void execute();
}
// MySQL語句
class MySQLStatement implements Statement {
public void prepare() {
System.out.println("Preparing MySQL statement");
}
public void execute() {
System.out.println("Executing MySQL statement");
}
}
// Oracle語句
class OracleStatement implements Statement {
public void prepare() {
System.out.println("Preparing Oracle statement");
}
public void execute() {
System.out.println("Executing Oracle statement");
}
}
// 抽象數據庫工廠
interface DatabaseFactory {
Connection createConnection();
Statement createStatement();
}
// MySQL工廠
class MySQLFactory implements DatabaseFactory {
public Connection createConnection() {
return new MySQLConnection();
}
public Statement createStatement() {
return new MySQLStatement();
}
}
// Oracle工廠
class OracleFactory implements DatabaseFactory {
public Connection createConnection() {
return new OracleConnection();
}
public Statement createStatement() {
return new OracleStatement();
}
}
// 客戶端代碼
class DatabaseClient {
private Connection connection;
private Statement statement;
public DatabaseClient(DatabaseFactory factory) {
connection = factory.createConnection();
statement = factory.createStatement();
}
public void executeOperations() {
connection.connect();
statement.prepare();
statement.execute();
}
}
// 使用示例
public class DatabaseDemo {
public static void main(String[] args) {
// 使用MySQL
DatabaseFactory mysqlFactory = new MySQLFactory();
DatabaseClient mysqlClient = new DatabaseClient(mysqlFactory);
mysqlClient.executeOperations();
// 使用Oracle
DatabaseFactory oracleFactory = new OracleFactory();
DatabaseClient oracleClient = new DatabaseClient(oracleFactory);
oracleClient.executeOperations();
}
}
抽象工廠模式通過引入抽象層解決了客戶端代碼與具體類實現的強耦合問題,使得系統能夠方便地切換整個產品族。在Java中實現該模式需要明確定義產品等級結構和產品族,通過接口和實現類清晰地分離抽象與具體。雖然該模式在增加新產品時不夠靈活,但在需要保證產品一致性和可配置性的場景下,它仍然是不可替代的優秀設計模式。 “`
這篇文章詳細介紹了Java中實現抽象工廠模式的方法,包含: 1. 模式定義和核心概念 2. 完整代碼示例(GUI組件和數據庫連接兩個案例) 3. 模式優勢與適用場景分析 4. 與其他設計模式的關系 5. 實際應用建議 6. 總結
全文約2400字,采用Markdown格式,包含清晰的代碼示例和結構化說明。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。