工厂模式的目的是封装对象的创建过程,实现:
-
面向接口编程
-
解耦调用方与具体实现
-
支持扩展,减少修改
# 工厂类测试
from abc import ABC, abstractmethod
# 定义接口类(基类)
class BasePayment(ABC):
@abstractmethod
def pay(self, amount):
pass
####################################
# 定义不同的子类
class Alipay(BasePayment):
def pay(self, amount):
print(f"使用支付宝支付{amount}元")
class WeChatPay(BasePayment):
def pay(self, amount):
print(f"使用微信支付{amount}元")
class CreditCard(BasePayment):
def pay(self, amount):
print(f"使用信用卡支付 {amount} 元")
#####################################################
# 创建工厂类
class PaymentFactory:
@staticmethod
def get_payment(method: str) -> BasePayment:
if method == 'alipay':
return Alipay()
elif method == 'wechat':
return WeChatPay()
elif method == 'credit':
return CreditCard()
else:
raise ValueError(f"未知的支付方式: {method}")
###############################################################
# 测试调用代码
def test_payment(method: str, amount: float):
try:
payment_instance = PaymentFactory.get_payment(method)
payment_instance.pay(amount)
except ValueError as e:
print(e)
# 示例测试
test_payment('alipay', 100)
test_payment('wechat', 50)
test_payment('credit', 200)
test_payment('paypal', 30) # 会触发异常
###############################################
打印:
使用支付宝支付100元
使用微信支付50元
使用信用卡支付 200 元
未知的支付方式: paypal
1. 接口类(抽象基类)
- 作用:定义所有支付方式的“统一接口”,调用方不需要知道具体实现,只管用
pay()
方法。 - 使用
ABC
和@abstractmethod
表明它是一个“抽象类”,不能被直接实例化,必须由子类实现。
2. 子类实现接口
- 每个类都是某种支付方式的具体实现,继承
BasePayment
。 - 实现了
pay()
方法,表示各自的行为。 - 这样一来,我们可以通过同一个接口
pay()
来调用,不管背后是哪个类。
3. 工厂类
- 作用:隐藏对象的创建逻辑,让调用者只需要传入一个标识(如
'alipay'
)就能获取对应对象。 - 这是依赖倒置原则的一种体现,调用者依赖的是接口,而不是具体实现。
- 以后新增一种支付方式,只需添加一个类和扩展此方法,不用改动调用代码。
4. 测试函数 / 调用者
- 作用:模拟调用方逻辑,它不需要知道具体用的是支付宝、微信还是信用卡。
- 只需要调用工厂来获取实现对象并调用其
pay()
方法,解耦了实现和调用。