目錄
一、設計思路
1. 簡單工廠模式
2. 工廠方法模式
3. 抽象工廠模式
二、UML類圖(PlantUML格式)
1.簡單工廠模式
2.工廠方法模式
3.抽象工廠模式
三、實現過程與結果
1. 簡單工廠模式
2. 工廠方法模式
3. 抽象工廠模式
四、總結
????????在面向對象設計中,工廠模式是一種常用的創建型設計模式,它通過將對象的創建邏輯集中管理,使得客戶端無需直接創建對象,而是通過工廠類來獲取所需的對象實例。這種設計思想不僅提高了代碼的可擴展性和可維護性,還增強了系統的靈活性。本文將通過一個鼠標和鍵盤的商品對象創建系統,詳細探討簡單工廠模式、工廠方法模式和抽象工廠模式的應用。
一、設計思路
1. 簡單工廠模式
簡單工廠模式通過一個統一的工廠類來創建對象,客戶端通過傳遞類型參數來指定需要創建的對象。這種模式適合產品種類較少且不會頻繁變化的場景。
-
鼠標接口:定義鼠標的基本行為。
-
具體鼠標類:實現無線鼠標和有線鼠標類,分別實現鼠標接口。
-
鼠標工廠類:根據傳入的類型參數創建相應的鼠標對象。
2. 工廠方法模式
工廠方法模式通過定義一個抽象工廠接口,讓具體的工廠類實現該接口來創建對象。客戶端通過使用抽象工廠接口,而不直接調用具體工廠類。這種模式適合產品種類較多且可能頻繁變化的場景。
-
鼠標接口:定義鼠標的基本行為。
-
具體鼠標類:實現無線鼠標和有線鼠標類。
-
抽象工廠接口:聲明創建鼠標的方法。
-
具體工廠類:實現抽象工廠接口,分別創建無線鼠標和有線鼠標。
3. 抽象工廠模式
抽象工廠模式通過一個抽象工廠接口來創建多個相關的產品族。具體工廠實現該接口,生產一組相關的產品。這種模式適合需要創建多個相關產品族的場景。
-
鼠標接口:定義鼠標的基本行為。
-
鍵盤接口:定義鍵盤的基本行為。
-
具體產品類:實現無線鼠標、有線鼠標、無線鍵盤和有線鍵盤類。
-
抽象工廠接口:聲明創建鼠標和鍵盤的方法。
-
具體工廠類:實現抽象工廠接口,分別創建無線設備(鼠標和鍵盤)和有線設備(鼠標和鍵盤)。
二、UML類圖(PlantUML格式)
1.簡單工廠模式
@startuml
interface Mouse {+ make()
}class WirelessMouse {+ make()
}class WiredMouse {+ make()
}class MouseFactory {+ createMouse(type: String): Mouse
}Mouse <|.. WirelessMouse
Mouse <|.. WiredMouse
MouseFactory --> Mouse
@enduml
2.工廠方法模式
@startuml
interface Mouse {+ make()
}class WirelessMouse {+ make()
}class WiredMouse {+ make()
}interface MouseFactory {+ createMouse(): Mouse
}class WirelessMouseFactory {+ createMouse(): Mouse
}class WiredMouseFactory {+ createMouse(): Mouse
}Mouse <|.. WirelessMouse
Mouse <|.. WiredMouse
MouseFactory <|.. WirelessMouseFactory
MouseFactory <|.. WiredMouseFactory
@enduml
3.抽象工廠模式
@startuml
interface Mouse {+ make()
}interface Keyboard {+ make()
}class WirelessMouse {+ make()
}class WiredMouse {+ make()
}class WirelessKeyboard {+ make()
}class WiredKeyboard {+ make()
}interface DeviceFactory {+ createMouse(): Mouse+ createKeyboard(): Keyboard
}class WirelessDeviceFactory {+ createMouse(): Mouse+ createKeyboard(): Keyboard
}class WiredDeviceFactory {+ createMouse(): Mouse+ createKeyboard(): Keyboard
}Mouse <|.. WirelessMouse
Mouse <|.. WiredMouse
Keyboard <|.. WirelessKeyboard
Keyboard <|.. WiredKeyboard
DeviceFactory <|.. WirelessDeviceFactory
DeviceFactory <|.. WiredDeviceFactory
@enduml
三、實現過程與結果
1. 簡單工廠模式
代碼實現:
public interface Mouse {void make();
}public class WirelessMouse implements Mouse {@Overridepublic void make() {System.out.println("制造無線鼠標");}
}public class WiredMouse implements Mouse {@Overridepublic void make() {System.out.println("制造有線鼠標");}
}public class MouseFactory {public Mouse createMouse(String type) {if ("wireless".equalsIgnoreCase(type)) {return new WirelessMouse();} else if ("wired".equalsIgnoreCase(type)) {return new WiredMouse();} else {return null;}}
}public class Demo {public static void main(String[] args) {MouseFactory factory = new MouseFactory();Mouse wirelessMouse = factory.createMouse("wireless");Mouse wiredMouse = factory.createMouse("wired");wirelessMouse.make(); // 輸出:制造無線鼠標wiredMouse.make(); // 輸出:制造有線鼠標}
}
2. 工廠方法模式
代碼實現:
public interface Mouse {void make();
}public class WirelessMouse implements Mouse {@Overridepublic void make() {System.out.println("制造無線鼠標");}
}public class WiredMouse implements Mouse {@Overridepublic void make() {System.out.println("制造有線鼠標");}
}public interface MouseFactory {Mouse createMouse();
}public class WirelessMouseFactory implements MouseFactory {@Overridepublic Mouse createMouse() {return new WirelessMouse();}
}public class WiredMouseFactory implements MouseFactory {@Overridepublic Mouse createMouse() {return new WiredMouse();}
}public class Demo {public static void main(String[] args) {MouseFactory wirelessFactory = new WirelessMouseFactory();MouseFactory wiredFactory = new WiredMouseFactory();Mouse wirelessMouse = wirelessFactory.createMouse();Mouse wiredMouse = wiredFactory.createMouse();wirelessMouse.make(); // 輸出:制造無線鼠標wiredMouse.make(); // 輸出:制造有線鼠標}
}
3. 抽象工廠模式
代碼實現:
public interface Mouse {void make();
}public interface Keyboard {void make();
}public class WirelessMouse implements Mouse {@Overridepublic void make() {System.out.println("制造無線鼠標");}
}public class WiredMouse implements Mouse {@Overridepublic void make() {System.out.println("制造有線鼠標");}
}public class WirelessKeyboard implements Keyboard {@Overridepublic void make() {System.out.println("制造無線鍵盤");}
}public class WiredKeyboard implements Keyboard {@Overridepublic void make() {System.out.println("制造有線鍵盤");}
}public interface DeviceFactory {Mouse createMouse();Keyboard createKeyboard();
}public class WirelessDeviceFactory implements DeviceFactory {@Overridepublic Mouse createMouse() {return new WirelessMouse();}@Overridepublic Keyboard createKeyboard() {return new WirelessKeyboard();}
}public class WiredDeviceFactory implements DeviceFactory {@Overridepublic Mouse createMouse() {return new WiredMouse();}@Overridepublic Keyboard createKeyboard() {return new WiredKeyboard();}
}public class Demo {public static void main(String[] args) {DeviceFactory wirelessFactory = new WirelessDeviceFactory();DeviceFactory wiredFactory = new WiredDeviceFactory();Mouse wirelessMouse = wirelessFactory.createMouse();Keyboard wirelessKeyboard = wirelessFactory.createKeyboard();Mouse wiredMouse = wiredFactory.createMouse();Keyboard wiredKeyboard = wiredFactory.createKeyboard();wirelessMouse.make(); // 輸出:制造無線鼠標wirelessKeyboard.make(); // 輸出:制造無線鍵盤wiredMouse.make(); // 輸出:制造有線鼠標wiredKeyboard.make(); // 輸出:制造有線鍵盤}
}
四、總結
工廠模式的三種主要形式及其適用場景。每種模式都有其獨特的優點和適用范圍,合理選擇和應用這些模式可以顯著提升軟件設計的質量和效率。
-
簡單工廠模式:簡單工廠模式以其簡潔性和易于理解的特點,非常適合產品種類較少且相對穩定的場景。它通過一個統一的工廠類集中管理對象的創建邏輯,使得客戶端代碼更加簡潔。然而,隨著產品種類的增加,簡單工廠類的條件判斷邏輯可能會變得復雜,這可能會降低代碼的可維護性。
-
工廠方法模式:工廠方法模式通過將對象的創建邏輯分散到多個具體的工廠類中,有效地解決了簡單工廠模式在面對產品種類頻繁變化時的擴展性問題。每個具體工廠類負責創建一種具體的產品,這使得系統在添加新產品時更加靈活,只需新增相應的工廠類而無需修改現有代碼。這種模式特別適合產品種類較多且可能頻繁變化的場景,它不僅提高了代碼的可擴展性,還符合開閉原則,即對擴展開放,對修改關閉。
-
抽象工廠模式:抽象工廠模式在處理多個相關產品族的創建時表現出色。它通過一個抽象工廠接口定義了一組創建相關產品的方法,具體工廠實現這些方法來生產特定產品族中的產品。這種模式使得系統能夠在不依賴具體產品實現的情況下,靈活地切換不同的產品族。這對于需要支持多種產品組合的系統來說是一個巨大的優勢,它不僅提高了代碼的可維護性,還增強了系統的靈活性和可擴展性。
????????在實際的軟件開發中,選擇合適的工廠模式需要綜合考慮系統的復雜性、產品的種類和變化頻率以及系統的擴展需求。簡單工廠模式適合小型項目或產品種類較少的場景;工廠方法模式適用于產品種類較多且可能頻繁變化的系統;而抽象工廠模式則更適合需要創建多個相關產品族的復雜系統。
????????此外,工廠模式的應用還體現了面向對象設計的核心原則,如封裝、多態和依賴倒置等。通過將對象的創建邏輯封裝在工廠類中,客戶端代碼可以依賴于抽象而非具體實現,這使得系統更加靈活,能夠更好地應對需求的變化。
????????總之,工廠模式作為一種經典的創建型設計模式,為對象的創建提供了一種優雅的解決方案。它不僅能夠提高代碼的可讀性和可維護性,還能夠增強系統的擴展性和靈活性。在未來的軟件設計中,合理運用工廠模式將有助于我們構建出更加健壯、靈活和易于維護的軟件系統。