抽象工厂模式(Abstract Factory)

在上一篇中,我们用工厂方法模式解决了“如何创建某一种对象”的问题。
但在真实项目中,你很快会遇到更复杂的情况:

不是创建一个对象,而是创建“一整套相关对象”。

这正是抽象工厂模式存在的原因。


一、什么时候工厂方法不够用

先看一个典型业务场景:

  • 系统需要支持 多种支付渠道
  • 每种支付渠道,都包含:
    • 支付接口
    • 对账接口
    • 退款接口

也就是说:

对象之间存在“成组出现”的关系。

如果仍然使用工厂方法:

pay = PaymentFactory.create("wechat")
refund = RefundFactory.create("wechat")
recon = ReconciliationFactory.create("wechat")

问题来了:

  • 调用方需要记住多组工厂
  • 容易出现“混用产品族”的问题
  • 结构开始变得混乱

二、抽象工厂模式是什么

抽象工厂模式(Abstract Factory)的定义:

提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。

核心关键词只有一个:

产品族(Product Family)


三、抽象工厂模式的结构

抽象工厂模式包含四个核心角色:

  1. 抽象产品 A
  2. 抽象产品 B
  3. 抽象工厂
  4. 具体工厂(对应一个产品族)

四、用支付系统举一个完整示例

1. 抽象产品

from abc import ABC, abstractmethod

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


class Refund(ABC):
    @abstractmethod
    def refund(self, amount):
        pass

2. 具体产品(微信产品族)

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


class WeChatRefund(Refund):
    def refund(self, amount):
        print(f"微信退款 {amount}")

3. 具体产品(支付宝产品族)

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


class AliRefund(Refund):
    def refund(self, amount):
        print(f"支付宝退款 {amount}")

4. 抽象工厂

class PayFactory(ABC):
    @abstractmethod
    def create_payment(self) -> Payment:
        pass

    @abstractmethod
    def create_refund(self) -> Refund:
        pass







次阅读

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


扫码关注

评论