0
点赞
收藏
分享

微信扫一扫

工厂模式:没你想像的那么难

夕阳孤草 03-01 16:30 阅读 3

工厂模式

工厂模式是一种创建型设计模式,它允许创建对象而无需指定将要创建的对象的具体类。它通过将对象的创建委托给一个单独的方法或类来完成,从而隐藏了对象的实例化逻辑。这样可以提高代码的灵活性,减少了代码中的重复和耦合。

在工厂模式中通常会包含以下几个要素:

  • 产品接口(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):
        pass

    def 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 版本的按钮和文本框。最后,在客户端代码中,我们根据当前操作系统选择对应的工厂,并使用工厂创建按钮和文本框,然后调用它们的渲染方法。

 查看原文:工厂模式:没你想像的那么难

举报

相关推荐

0 条评论