工厂模式
工厂模式是一种创建型设计模式,它允许创建对象而无需指定将要创建的对象的具体类。它通过将对象的创建委托给一个单独的方法或类来完成,从而隐藏了对象的实例化逻辑。这样可以提高代码的灵活性,减少了代码中的重复和耦合。
在工厂模式中通常会包含以下几个要素:
- 产品接口(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 版本的按钮和文本框。最后,在客户端代码中,我们根据当前操作系统选择对应的工厂,并使用工厂创建按钮和文本框,然后调用它们的渲染方法。
查看原文:工厂模式:没你想像的那么难
关注公众号 "字节航海家" 及时获取最新内容