# core 工廠模式(Factory Pattern)是一種創建型設計模式,用於創建對象而不暴露對象創建的邏輯。它將對象的實例化過程封裝在一個工廠類中,客戶端通過調用工廠類的方法來創建對象,從而實現瞭解耦和靈活性。 工廠模式的核心思想是將對象的創建與使用分離。客戶端不直接實例化對象,而是通過調用工 ...
core
工廠模式(Factory Pattern)是一種創建型設計模式,用於創建對象而不暴露對象創建的邏輯。它將對象的實例化過程封裝在一個工廠類中,客戶端通過調用工廠類的方法來創建對象,從而實現瞭解耦和靈活性。
工廠模式的核心思想是將對象的創建與使用分離。客戶端不直接實例化對象,而是通過調用工廠類的方法來獲取對象實例。工廠類根據客戶端的需求,決定實例化哪個具體對象,並將其返回給客戶端。
三種工廠模式的識別
簡單工廠模式
、工廠方法模式
和抽象工廠模式
都屬於創建型設計模式,用於封裝對象的創建過程(相同點),但它們之間有明顯的區別。
不同點:
-
簡單工廠模式(Simple Factory Pattern):
簡單工廠模式通過一個工廠類來創建產品對象,客戶端通過調用工廠類的靜態方法或實例方法來獲取對象實例。
工廠類負責根據客戶端的需求,決定實例化哪個具體產品類。
簡單工廠模式的主要特點是工廠類集中了對象的創建邏輯,客戶端通過工廠類來創建產品對象,而無需直接實例化具體產品類。但是,當需求變化時,需要修改工廠類的代碼。 -
工廠方法模式(Factory Method Pattern):
工廠方法模式將對象的創建延遲到子類中,每個具體產品類都有對應的工廠類。
抽象工廠類定義了創建產品對象的抽象方法,每個具體工廠類實現了抽象工廠類,負責創建具體產品的實例。
客戶端通過調用具體工廠類的方法來創建產品對象。客戶端可以通過擴展抽象工廠類和具體工廠類來創建新的產品。 -
抽象工廠模式(Abstract Factory Pattern):
抽象工廠模式提供了一種創建一系列相關或相互依賴對象的介面,而無需指定具體類。
抽象工廠模式包括抽象工廠類、具體工廠類、抽象產品類和具體產品類。
抽象工廠類定義了一組創建產品對象的抽象方法,每個具體工廠類實現了抽象工廠類,負責創建一組相關的具體產品。
客戶端通過調用具體工廠類的方法來創建一組相關的產品對象。
總結:
簡單工廠模式適用於創建單一類型的產品,通過一個工廠類來創建產品對象。
工廠方法模式適用於創建一類產品,每個具體產品都有對應的工廠類,通過擴展工廠類來創建新的產品。
抽象工廠模式適用於創建一組相關的產品,每個具體工廠類負責創建一組相關的產品對象。
選擇使用哪種模式取決於具體需求和設計目標:
- 簡單工廠模式簡單易用,但對於複雜的產品結構不夠靈活;
- 工廠方法模式適用於需要靈活擴展產品類的情況;
- 抽象工廠模式適用於需要創建一組相關產品 並保持一致性的情況。(抽象工廠模式適用於一組相關的產品對象的創建,如果產品對象之間沒有相關性或依賴關係,請考慮使用工廠方法模式。)
Simple Factory Pattern
下麵是一個簡單的示例代碼,說明瞭簡單工廠模式的基本結構:
// 產品介面
interface Product {
void operation();
}
// 具體產品A
class ConcreteProductA implements Product {
public void operation() {
System.out.println("ConcreteProductA operation");
}
}
// 具體產品B
class ConcreteProductB implements Product {
public void operation() {
System.out.println("ConcreteProductB operation");
}
}
// 工廠類
class Factory {
public Product createProduct(String type) {
if (type.equals("A")) {
return new ConcreteProductA();
} else if (type.equals("B")) {
return new ConcreteProductB();
}
return null;
}
}
// 客戶端代碼
public class Client {
public static void main(String[] args) {
Factory factory = new Factory();
// 創建具體產品A
Product productA = factory.createProduct("A");
productA.operation();
// 創建具體產品B
Product productB = factory.createProduct("B");
productB.operation();
}
}
在上面的示例中,Product 是產品介面,定義了產品的操作方法。ConcreteProductA 和 ConcreteProductB 是具體產品類,實現了產品介面,並定義了各自的操作方法。Factory 是工廠類,負責創建產品對象的方法。客戶端通過調用工廠類的方法來創建具體產品的實例,並調用其操作方法。
通過使用工廠模式,客戶端可以通過工廠類來創建具體產品的實例,而無需直接依賴具體產品類。這樣可以實現代碼的解耦和靈活性,使得系統更易於擴展和維護。
Factory Method Pattern
下麵是一個簡單的示例代碼,說明瞭工廠方法模式的基本結構:
// 抽象產品
interface Product {
void operation();
}
// 具體產品A
class ConcreteProductA implements Product {
public void operation() {
System.out.println("ConcreteProductA operation");
}
}
// 具體產品B
class ConcreteProductB implements Product {
public void operation() {
System.out.println("ConcreteProductB operation");
}
}
// 抽象工廠
interface Factory {
Product createProduct();
}
// 具體工廠A
class ConcreteFactoryA implements Factory {
public Product createProduct() {
return new ConcreteProductA();
}
}
// 具體工廠B
class ConcreteFactoryB implements Factory {
public Product createProduct() {
return new ConcreteProductB();
}
}
// 客戶端代碼
public class Client {
public static void main(String[] args) {
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.operation();
Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.operation();
}
}
在上面的示例中,Product 是抽象產品介面,定義了產品的操作方法。ConcreteProductA 和 ConcreteProductB 是具體產品類,實現了產品介面,並定義了各自的操作方法。Factory 是抽象工廠介面,定義了創建產品對象的抽象方法。ConcreteFactoryA 和 ConcreteFactoryB 是具體工廠類,實現了抽象工廠介面,負責創建具體產品的實例。
客戶端通過調用具體工廠類的方法來創建具體產品的實例,並調用其操作方法。通過使用工廠方法模式,客戶端可以通過工廠類來創建產品對象,而無需直接依賴具體產品類。這樣可以實現代碼的解耦和靈活性,使得系統更易於擴展和維護。
Abstract Factory Pattern
一個常見的實際應用抽象工廠模式的例子是圖形用戶界面(GUI)庫。假設我們正在開發一個跨平臺的GUI庫,需要支持不同操作系統(如Windows、macOS和Linux)下的視窗和按鈕。
在這種情況下,可以使用抽象工廠模式來創建一組相關的產品對象,包括視窗和按鈕。首先,定義抽象產品介面:
// 抽象視窗產品
interface Window {
void render();
}
// 抽象按鈕產品
interface Button {
void click();
}
然後,實現具體的視窗和按鈕產品類,每個操作系統對應一個具體產品類:
// Windows視窗產品
class WindowsWindow implements Window {
public void render() {
System.out.println("Render Windows window");
}
}
// Windows按鈕產品
class WindowsButton implements Button {
public void click() {
System.out.println("Click Windows button");
}
}
//----------------------------------------------------------
// macOS視窗產品
class MacOSWindow implements Window {
public void render() {
System.out.println("Render macOS window");
}
}
// macOS按鈕產品
class MacOSButton implements Button {
public void click() {
System.out.println("Click macOS button");
}
}
//----------------------------------------------------------
// Linux視窗產品
class LinuxWindow implements Window {
public void render() {
System.out.println("Render Linux window");
}
}
// Linux按鈕產品
class LinuxButton implements Button {
public void click() {
System.out.println("Click Linux button");
}
}
接下來,定義抽象工廠介面來創建視窗和按鈕:
// 抽象GUI工廠
interface GUIFactory {
Window createWindow();
Button createButton();
}
然後,實現具體的GUI工廠類,每個操作系統對應一個具體工廠類:
// Windows GUI工廠
class WindowsGUIFactory implements GUIFactory {
public Window createWindow() {
return new WindowsWindow();
}
public Button createButton() {
return new WindowsButton();
}
}
// macOS GUI工廠
class MacOSGUIFactory implements GUIFactory {
public Window createWindow() {
return new MacOSWindow();
}
public Button createButton() {
return new MacOSButton();
}
}
// Linux GUI工廠
class LinuxGUIFactory implements GUIFactory {
public Window createWindow() {
return new LinuxWindow();
}
public Button createButton() {
return new LinuxButton();
}
}
現在,客戶端可以通過抽象工廠來創建特定操作系統下的視窗和按鈕,並使用它們:
public class Client {
public static void main(String[] args) {
// 創建Windows風格的GUI
GUIFactory windowsFactory = new WindowsGUIFactory();
Window windowsWindow = windowsFactory.createWindow();
Button windowsButton = windowsFactory.createButton();
windowsWindow.render();
windowsButton.click();
// 創建macOS風格的GUI
GUIFactory macosFactory = new MacOSGUIFactory();
Window macosWindow = macosFactory.createWindow();
Button macosButton = macosFactory.createButton();
macosWindow.render();
macosButton.click();
// 創建Linux風格的GUI
GUIFactory linuxFactory = new LinuxGUIFactory();
Window linuxWindow = linuxFactory.createWindow();
Button linuxButton = linuxFactory.createButton();
linuxWindow.render();
linuxButton.click();
}
}
通過使用抽象工廠模式,我們可以輕鬆地擴展GUI庫以支持新的操作系統,只需實現新的具體產品和具體工廠類即可,而不需要修改現有的客戶端代碼。這樣,不同操作系統下的視窗和按鈕將保持一致性,並且客戶端無需關心具體產品的創建過程,只需使用抽象工廠介面來創建產品對象。