Python设计模式 - 工厂方法模式

定义

工厂方法模式是一种创建型设计模式,它定义一个创建对象的接口,让其子类来处理对象的创建,而不是直接实例化对象。

结构

抽象工厂(Factory):声明工厂方法,返回一个产品对象。具体工厂类都必须实现该方法。

具体工厂(Concrete Factory):实现工厂方法以创建具体的产品对象。

抽象产品(Product):定义产品对象的接口。

具体产品(Concrete Product):实现产品接口的具体产品对象。

应用场景

  1. 产品类型繁多且结构相似:当产品类型较多且具有相似的结构时,可以使用工厂方法模式来管理创建逻辑。抽象工厂类定义抽象方法,具体工厂类实现抽象方法创建具体的产品对象,从而简化客户端代码。例如不同类型的日志记录器、不同类型的报表生成器等。
  2. 处理复杂创建过程:当对象的创建过程比较复杂,需要很多步骤或依赖其他对象。工厂方法模式可以将这些复杂的创建过程封装在工厂方法中,从而简化客户端代码,并确保对象创建的一致性。例如,不同类型的数据库连接、复杂的对象初始化流程等。
  3. 系统需要良好的扩展性:当系统需要能够方便地引入新的产品对象时,可以使用工厂方法模式。通过新增具体工厂类并实现工厂方法,可以在不修改现有代码的情况下扩展系统的功能。

优缺点

优点:

  1. 简化客户端代码:客户端代码不需要了解具体产品类的创建细节,只需调用工厂类的创建方法即可获得所需的对象。这减少了客户端代码的复杂性,使其更容易维护和理解。
  2. 提高代码的可维护性:工厂方法模式将复杂的对象创建过程封装在工厂方法中,客户端代码不需要关心对象的创建细节,从而简化了代码的维护。
  3. 符合开闭原则:工厂方法模式符合面向对象设计中的开闭原则,即对扩展开放,对修改关闭。新增产品类时,无需修改现有的工厂类,只要新增具体工厂类即可。

缺点:

  1. 增加代码复杂性:工厂方法模式引入了额外的类和接口,这可能会增加代码的复杂性,也会增加运行时资源的开销,尤其是在产品类和工厂类数量较多的情况下。

代码示例

python 复制代码
from abc import ABC, abstractmethod


# 抽象产品类
class Vehicle(ABC):
    @abstractmethod
    def drive(self) -> str:
        pass


# 具体产品类 - 汽车
class Car(Vehicle):
    def drive(self) -> str:
        return "Driving a car"


# 具体产品类 - 自行车
class Bicycle(Vehicle):
    def drive(self) -> str:
        return "Riding a bicycle"


# 抽象工厂类
class VehicleFactory(ABC):
    @abstractmethod
    def create_vehicle(self) -> Vehicle:
        pass


# 具体工厂类 - 汽车工厂
class CarFactory(VehicleFactory):
    def create_vehicle(self) -> Vehicle:
        return Car()


# 具体工厂类 - 自行车工厂
class BicycleFactory(VehicleFactory):
    def create_vehicle(self) -> Vehicle:
        return Bicycle()


# 客户端代码
def client_code(factory: VehicleFactory) -> None:
    vehicle = factory.create_vehicle()
    print(f"Client: {vehicle.drive()}")


if __name__ == "__main__":
    print("App: Using the CarFactory.")
    client_code(CarFactory())
    print("\n")
    print("App: Using the BicycleFactory.")
    client_code(BicycleFactory())

工厂方法模式和简单工厂模式的比较

工厂方法模式是简单工厂模式的延伸,它继承了简单工厂模式的优点,同时也弥补了简单工厂模式的不足。它针对不同的产品提供不同的工厂,可以很好地解决简单工厂模式的以下两个问题:

  1. 违反开闭原则:每当需要添加新的产品类型时,都必须修改工厂类以添加新的创建逻辑,违反了开闭原则。
  2. 可能包含大量的条件判断:工厂类中的条件判断语句会随着产品种类的增加而变得冗长且复杂。

工厂方法模式和简单工厂模式适用于不同的场景:

  1. 简单工厂模式的灵活性和扩展性较低,适用于产品种类相对固定且变化不频繁的场景。工厂方法模式适用于产品种类较多且经常变化的场景,尤其需要在不修改现有代码的情况下添加新产品时。
  2. 简单工厂模式的实现和使用都较简单,适合小型系统或简单场景。工厂方法模式的实现和使用都较复杂,适合大型系统或复杂场景。

参考

《设计模式的艺术》

相关推荐
hence..7 分钟前
Vscode写markdown快速插入python代码
ide·vscode·python
DanielYQ1 小时前
LCR 001 两数相除
开发语言·python·算法
vener_1 小时前
LuckySheet协同编辑后端示例(Django+Channel,Websocket通信)
javascript·后端·python·websocket·django·luckysheet
封步宇AIGC2 小时前
量化交易系统开发-实时行情自动化交易-4.2.3.指数移动平均线实现
人工智能·python·机器学习·数据挖掘
互联网杂货铺2 小时前
自动化测试基础知识总结
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
小汤猿人类2 小时前
SpringTask
开发语言·python
小白不太白9502 小时前
设计模式之建造者模式
java·设计模式·建造者模式
网络安全(king)2 小时前
【Python】【持续项目】Python-安全项目搜集
开发语言·python·安全
工业甲酰苯胺2 小时前
Python脚本消费多个Kafka topic
开发语言·python·kafka
做程序员的第一天3 小时前
在PyTorch中,钩子(hook)是什么?在神经网络中扮演什么角色?
pytorch·python·深度学习