使用Python创建工厂类

工厂模式的目的是封装对象的创建过程,实现:

  • 面向接口编程

  • 解耦调用方与具体实现

  • 支持扩展,减少修改

# 工厂类测试
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() 方法,解耦了实现和调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值