工厂方法模式(Factory Method)

在真实项目中,对象的创建往往比使用更复杂
如果你发现代码中频繁出现 if-else 或根据参数去 new 不同的类,那基本已经到了该用工厂方法模式的时候了。


一、工厂方法模式解决什么问题

先看一个非常常见的写法:

def create_payment(pay_type):
    if pay_type == "wechat":
        return WeChatPay()
    elif pay_type == "alipay":
        return AliPay()
    elif pay_type == "bank":
        return BankPay()
    else:
        raise ValueError("unsupported pay type")

问题很明显:

  • 新增一种支付方式,必须修改这个函数
  • 创建逻辑与业务逻辑耦合
  • 违反开闭原则

工厂方法模式的目的就是:

把“创建对象的逻辑”从使用对象的地方解耦出来。


二、什么是工厂方法模式

工厂方法模式(Factory Method)的定义:

定义一个创建对象的接口,让子类决定实例化哪一个类。

核心思想:

  • 使用方只依赖抽象
  • 创建细节由工厂或子类负责

三、一个最基础的 Python 工厂方法示例

1. 抽象产品

from abc import ABC, abstractmethod

class Payment(ABC):
    @abstractmethod
    def pay(self, amount):
        pass

2. 具体产品

class WeChatPay(Payment):
    def pay(self, amount):
        print(f"微信支付 {amount}")

class AliPay(Payment):
    def pay(self, amount):
        print(f"支付宝支付 {amount}")

3. 工厂类

class PaymentFactory:
    @staticmethod
    def create(pay_type: str) -> Payment:
        if pay_type == "wechat":
            return WeChatPay()
        if pay_type == "alipay":
            return AliPay()
        raise ValueError("unsupported pay type")

使用方:

payment = PaymentFactory.create("wechat")
payment.pay(100)

四、为什么这还不够“工厂方法”

上面的写法虽然集中管理了创建逻辑,但:

  • 依然需要修改工厂代码
  • 本质还是 if-else

真正的工厂方法强调:

通过继承扩展工厂,而不是修改工厂。


五、标准工厂方法模式结构

1. 抽象工厂

class PaymentFactory(ABC):
    @abstractmethod
    def create(self) -> Payment:
        pass






次阅读

扫描下方二维码,关注公众号:程序进阶之路,实时获取更多优质文章推送。


扫码关注

评论