工廠模式
工廠模式是一種創建型設計模式,它允許創建對象而無需指定將要創建的對象的具體類。它通過將對象的創建委托給一個單獨的方法或類來完成,從而隱藏了對象的實例化邏輯。這樣可以提高代碼的靈活性,減少了代碼中的重復和耦合。
在工廠模式中通常會包含以下幾個要素:
- 產品接口(Product Interface):定義了要創建的對象的通用接口。
- 具體產品(Concrete Product):實現了產品接口的具體對象。
- 工廠接口(Factory Interface):定義了一個創建對象的方法,通常是一個接口或者抽象類。
- 具體工廠(Concrete Factory):實現了工廠接口,負責創建具體產品的對象。
現在,讓我們通過一個 Python 示例來說明工廠模式的用法。假設我們有一個簡單的圖形繪制應用,它可以繪制圓形和矩形。我們將使用工廠模式來創建這些形狀對象。
# 產品接口:形狀
class Shape:def draw(self):pass# 具體產品:圓形
class Circle(Shape):def draw(self):print("Inside Circle::draw() method.")# 具體產品:矩形
class Rectangle(Shape):def draw(self):print("Inside Rectangle::draw() method.")# 工廠接口
class ShapeFactory:def create_shape(self, shape_type):pass# 具體工廠:形狀工廠
class SimpleShapeFactory(ShapeFactory):def create_shape(self, shape_type):if shape_type.lower() == "circle":return Circle()elif shape_type.lower() == "rectangle":return Rectangle()else:raise ValueError("Unsupported shape type: " + shape_type)# 客戶端代碼
if __name__ == "__main__":# 創建形狀工廠對象shape_factory = SimpleShapeFactory()# 根據工廠創建形狀對象circle = shape_factory.create_shape("circle")circle.draw()rectangle = shape_factory.create_shape("rectangle")rectangle.draw()
在這個示例中,我們定義了 Shape 接口作為產品接口,然后實現了具體的產品類 Circle 和 Rectangle。接著,我們定義了一個工廠接口 ShapeFactory 和一個具體工廠類 SimpleShapeFactory,后者實現了創建形狀對象的方法 create_shape。最后,在客戶端代碼中,我們使用工廠對象來創建具體的形狀對象,而無需直接實例化具體的產品類。
這種設計使得客戶端代碼與具體的產品類解耦,使得在需要添加新的產品類型時,只需要修改工廠類而無需修改客戶端代碼,從而提高了代碼的可維護性和可擴展性。
抽象工廠模式
抽象工廠模式是一種創建型設計模式,它提供了一種創建一系列相關或依賴對象的方法,而無需指定其具體類。該模式通過引入抽象工廠和具體工廠來實現,從而使得客戶端代碼與具體產品類的實現相互獨立。
抽象工廠模式通常涉及以下幾個關鍵組件:
- 抽象工廠(Abstract Factory):定義了一組方法,用于創建一系列相關或依賴對象的抽象接口。
- 具體工廠(Concrete Factory):實現了抽象工廠接口,并負責創建具體產品族的對象。
- 抽象產品(Abstract Product):定義了一組相關或依賴對象的抽象接口。
- 具體產品(Concrete Product):實現了抽象產品接口的具體對象。
抽象工廠模式與工廠模式相比,其可以創建一組相關的對象,而不僅僅是單個對象。
下面是一個簡單的 Python 示例,演示了抽象工廠模式的應用。假設我們有一個圖形界面庫,它包含按鈕和文本框兩種組件,我們可以根據不同的操作系統(例如 Windows 和 macOS)創建對應的按鈕和文本框。
# 抽象產品:按鈕接口
class Button:def paint(self):pass# 具體產品:Windows 按鈕
class WindowsButton(Button):def paint(self):print("Rendering a Windows style button.")# 具體產品:macOS 按鈕
class MacOSButton(Button):def paint(self):print("Rendering a macOS style button.")# 抽象產品:文本框接口
class TextBox:def paint(self):pass# 具體產品:Windows 文本框
class WindowsTextBox(TextBox):def paint(self):print("Rendering a Windows style text box.")# 具體產品:macOS 文本框
class MacOSTextBox(TextBox):def paint(self):print("Rendering a macOS style text box.")# 抽象工廠:UI 工廠接口
class UIFactory:def create_button(self):passdef create_text_box(self):pass# 具體工廠:Windows UI 工廠
class WindowsUIFactory(UIFactory):def create_button(self):return WindowsButton()def create_text_box(self):return WindowsTextBox()# 具體工廠:macOS UI 工廠
class MacOSUIFactory(UIFactory):def create_button(self):return MacOSButton()def create_text_box(self):return MacOSTextBox()# 客戶端代碼
if __name__ == "__main__":# 根據當前操作系統選擇對應的 UI 工廠os = "windows" # 可以根據實際情況修改if os.lower() == "windows":ui_factory = WindowsUIFactory()elif os.lower() == "macos":ui_factory = MacOSUIFactory()else:raise ValueError("Unsupported operating system: " + os)# 使用 UI 工廠創建按鈕和文本框button = ui_factory.create_button()text_box = ui_factory.create_text_box()# 渲染按鈕和文本框button.paint()text_box.paint()
在這個示例中,我們定義了抽象產品接口 Button 和 TextBox,以及兩種具體產品類(Windows 和 macOS 版本)。然后,我們定義了抽象工廠接口 UIFactory 和兩個具體工廠類(WindowsUIFactory 和 MacOSUIFactory),分別用于創建 Windows 和 macOS 版本的按鈕和文本框。最后,在客戶端代碼中,我們根據當前操作系統選擇對應的工廠,并使用工廠創建按鈕和文本框,然后調用它們的渲染方法。
?查看原文:工廠模式:沒你想像的那么難
關注公眾號 "字節航海家" 及時獲取最新內容