【Python设计模式07】工厂方法模式

发布于:2024-05-23 ⋅ 阅读:(107) ⋅ 点赞:(0)

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。通过使用工厂方法模式,可以将对象的创建过程与使用过程分离,从而提高代码的灵活性和可扩展性。

工厂方法模式的结构

工厂方法模式主要包括以下几个角色:

  1. 抽象产品(Product):定义产品的接口。
  2. 具体产品(ConcreteProduct):实现抽象产品接口的具体产品类。
  3. 抽象工厂(Creator):声明工厂方法,用于返回一个产品对象。可以定义一个工厂方法的默认实现。
  4. 具体工厂(ConcreteCreator):实现抽象工厂接口,重定义工厂方法以返回一个具体产品实例。

示例

假设我们有一个日志系统,可以记录日志到控制台或文件。我们可以使用工厂方法模式来实现不同日志记录方式的选择和创建。

定义抽象产品和具体产品
from abc import ABC, abstractmethod

class Logger(ABC):
    @abstractmethod
    def log(self, message: str):
        pass

class ConsoleLogger(Logger):
    def log(self, message: str):
        print(f"Console: {message}")

class FileLogger(Logger):
    def __init__(self, filename: str):
        self.filename = filename

    def log(self, message: str):
        with open(self.filename, 'a') as f:
            f.write(f"File: {message}\n")
定义抽象工厂和具体工厂
class LoggerFactory(ABC):
    @abstractmethod
    def create_logger(self) -> Logger:
        pass

class ConsoleLoggerFactory(LoggerFactory):
    def create_logger(self) -> Logger:
        return ConsoleLogger()

class FileLoggerFactory(LoggerFactory):
    def __init__(self, filename: str):
        self.filename = filename

    def create_logger(self) -> Logger:
        return FileLogger(self.filename)
使用工厂方法模式
def main():
    # 创建控制台日志记录器
    console_factory = ConsoleLoggerFactory()
    console_logger = console_factory.create_logger()
    console_logger.log("This is a console log message.")

    # 创建文件日志记录器
    file_factory = FileLoggerFactory("app.log")
    file_logger = file_factory.create_logger()
    file_logger.log("This is a file log message.")

if __name__ == "__main__":
    main()

在这个示例中,Logger是抽象产品,ConsoleLoggerFileLogger是具体产品。LoggerFactory是抽象工厂,ConsoleLoggerFactoryFileLoggerFactory是具体工厂。通过工厂方法模式,我们可以灵活地选择和创建不同类型的日志记录器,而不需要修改客户端代码。

工厂方法模式的优缺点

优点
  1. 遵循开闭原则:可以在不修改现有代码的情况下增加新产品。
  2. 提高灵活性:可以根据需要在运行时选择和创建具体的产品。
  3. 封装对象创建过程:将对象的创建过程封装在工厂类中,减少了客户端代码的复杂性。
缺点
  1. 增加代码复杂性:引入更多的类和接口,增加了代码的复杂性。
  2. 难以管理:当产品种类增多时,可能会导致工厂类的数量增加,管理起来较为困难。

工厂方法模式的适用场景

  1. 创建对象需要较复杂的过程:对象的创建过程较为复杂,包含多个步骤或涉及多个依赖时,可以使用工厂方法模式。
  2. 需要灵活地创建不同类型的对象:根据不同的条件或环境,在运行时选择和创建不同类型的对象。
  3. 遵循开闭原则:需要在不修改现有代码的情况下增加新产品。

工厂方法模式与简单工厂模式的区别

  • 简单工厂模式:由一个工厂类负责创建所有产品,工厂类通常包含一个静态方法,根据传入的参数来创建具体产品。简单工厂模式不符合开闭原则。
  • 工厂方法模式:将对象创建的职责分散到多个具体工厂类中,每个具体工厂类负责创建一种具体产品。工厂方法模式符合开闭原则。

总结

工厂方法模式是一种创建型设计模式,通过定义一个用于创建对象的接口,将对象的创建过程延迟到子类,从而提高代码的灵活性和可扩展性。通过使用工厂方法模式,可以在不修改现有代码的情况下增加新产品,减少了代码耦合,提高了系统的可维护性。合理应用工厂方法模式,可以显著提升代码质量和设计水平。