創建型模式
工廠方法模式 (Factory Method Pattern)
工廠方法模式(Factory Method Pattern)是一種創建型設計模式,提供了一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法模式讓類的實例化推遲到子類。這樣,客戶端代碼將依賴于具體子類的實現,而不是直接依賴于具體的對象。
適用場景
-
代碼需要處理不同類型的對象,但不希望將對象的創建邏輯耦合到代碼中:
- 比如,在處理不同數據庫類型(如 MySQL、PostgreSQL)時,可以使用工廠方法模式來創建數據庫連接對象,而不需要在客戶端代碼中直接引用具體的數據庫類。
-
代碼中涉及復雜的對象創建過程:
- 如果對象的創建過程很復雜,包括許多步驟和配置,工廠方法模式可以將創建邏輯集中在一個地方,簡化客戶端代碼。
-
客戶端代碼不應依賴于具體類來創建對象:
- 工廠方法模式使客戶端代碼依賴于抽象類或接口,從而提高代碼的靈活性和可擴展性。
實現示例(Java)
下面是一個使用工廠方法模式的示例,展示如何創建不同類型的日志記錄器(如文件日志記錄器和數據庫日志記錄器):
1. 定義產品接口或抽象類
public interface Logger {void log(String message);
}
2. 具體產品類實現接口或繼承抽象類
public class FileLogger implements Logger {@Overridepublic void log(String message) {System.out.println("File logger: " + message);}
}public class DatabaseLogger implements Logger {@Overridepublic void log(String message) {System.out.println("Database logger: " + message);}
}
3. 定義工廠方法的抽象類
public abstract class LoggerFactory {public abstract Logger createLogger();public void log(String message) {Logger logger = createLogger();logger.log(message);}
}
4. 具體工廠類實現工廠方法
public class FileLoggerFactory extends LoggerFactory {@Overridepublic Logger createLogger() {return new FileLogger();}
}public class DatabaseLoggerFactory extends LoggerFactory {@Overridepublic Logger createLogger() {return new DatabaseLogger();}
}
5. 客戶端代碼
public class Main {public static void main(String[] args) {LoggerFactory factory;Logger logger;// 使用文件日志記錄器factory = new FileLoggerFactory();factory.log("This is a file log message.");// 使用數據庫日志記錄器factory = new DatabaseLoggerFactory();factory.log("This is a database log message.");}
}
工廠方法模式的優點
-
代碼解耦:
- 客戶端代碼依賴于抽象產品接口或抽象工廠,而不是具體的產品類,從而實現了代碼的解耦。
-
提高靈活性:
- 新的具體產品可以通過實現產品接口并創建相應的具體工廠類來添加,而無需修改現有代碼。
-
單一職責原則:
- 將對象創建的責任委派給具體工廠類,符合單一職責原則。
工廠方法模式的缺點
-
類的數量增加:
- 每添加一種新的產品類型,都需要創建一個具體產品類和相應的具體工廠類,可能會導致類的數量增加。
-
實現復雜:
- 工廠方法模式可能會使代碼結構變得復雜,特別是在存在多個產品層次結構時。
總結
工廠方法模式通過將對象的創建過程封裝在工廠方法中,實現了客戶端代碼與具體產品類的解耦。它適用于對象創建過程復雜、多種類型的對象創建等場景,有助于提高代碼的靈活性和可維護性。
抽象工廠模式
抽象工廠模式(Abstract Factory Pattern)是一種創建型設計模式,它提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。抽象工廠模式通過對產品類的工廠進行抽象,使得一個工廠可以生產多種類型的產品。
適用場景
-
系統需要獨立于產品創建的方式時:
- 客戶端代碼不需要知道具體產品的創建過程,只需要知道如何使用抽象接口。
-
系統有多個產品系列,每個系列有多種類型的產品時:
- 例如,GUI庫可能提供不同風格的窗口和按鈕(如Windows風格和Mac風格),抽象工廠可以提供一個接口來創建不同風格的組件。
-
需要保證產品系列的一致性時:
- 抽象工廠模式確保同一個工廠創建的產品系列是兼容的。
實現示例(Java)
以下是一個簡單的抽象工廠模式的實現示例,展示如何創建不同風格的GUI組件(如按鈕和復選框)。
1. 定義抽象產品接口
// 抽象產品A
public interface Button {void paint();
}// 抽象產品B
public interface Checkbox {void paint();
}
2. 具體產品類實現抽象產品接口
// 具體產品A1
public class WindowsButton implements Button {@Overridepublic void paint() {System.out.println("Windows Button");}
}// 具體產品A2
public class MacButton implements Button {@Overridepublic void paint() {System.out.println("Mac Button");}
}// 具體產品B1
public class WindowsCheckbox implements Checkbox {@Overridepublic void paint() {System.out.println("Windows Checkbox");}
}// 具體產品B2
public class MacCheckbox implements Checkbox {@Overridepublic void paint() {System.out.println("Mac Checkbox");}
}
3. 定義抽象工廠接口
public interface GUIFactory {Button createButton();Checkbox createCheckbox();
}
4. 具體工廠類實現抽象工廠接口
// 具體工廠1
public class WindowsFactory implements GUIFactory {@Overridepublic Button createButton() {return new WindowsButton();}@Overridepublic Checkbox createCheckbox() {return new WindowsCheckbox();}
}// 具體工廠2
public class MacFactory implements GUIFactory {@Overridepublic Button createButton() {return new MacButton();}@Overridepublic Checkbox createCheckbox() {return new MacCheckbox();}
}
5. 客戶端代碼
public class Application {private Button button;private Checkbox checkbox;// 構造函數接收抽象工廠類型public Application(GUIFactory factory) {button = factory.createButton();checkbox = factory.createCheckbox();}// 模擬繪制方法public void paint() {button.paint();checkbox.paint();}public static void main(String[] args) {// 可根據需求選擇具體工廠GUIFactory factory = new WindowsFactory();Application app = new Application(factory);app.paint();factory = new MacFactory();app = new Application(factory);app.paint();}
}
注釋說明
-
抽象產品接口:
Button
和Checkbox
是兩個抽象產品接口,定義了產品的通用行為(如paint
方法)。
-
具體產品類:
WindowsButton
、MacButton
、WindowsCheckbox
和MacCheckbox
是具體產品類,它們實現了抽象產品接口,提供具體的產品行為。
-
抽象工廠接口:
GUIFactory
是抽象工廠接口,定義了創建一系列相關產品的方法(如createButton
和createCheckbox
)。
-
具體工廠類:
WindowsFactory
和MacFactory
是具體工廠類,它們實現了抽象工廠接口,提供了具體的產品創建方法。
-
客戶端代碼:
Application
類通過依賴抽象工廠接口來創建產品。這樣,客戶端代碼與具體產品類解耦,便于擴展和維護。
總結
抽象工廠模式通過對產品類和工廠類的抽象,使得客戶端代碼可以獨立于具體產品類和工廠類進行工作。它適用于需要創建一系列相關或相互依賴對象的系統,有助于提高代碼的靈活性和一致性。