简单工厂模式
不直接向客户端暴露对象创建的实现细节,而通过一个工厂类来负责创建产品类的实例。
简单工厂模式的组成:
- 抽象产品(Abstract Product): 定义产品的接口,在这个例子中是
Payment
类。- 具体产品(Concrete Product): 实现抽象产品接口的类,在这个例子中是
Alipay
和WechatPay
。- 工厂(Factory): 一个负责创建具体产品实例的类,在这个例子中是
PaymentFactory
。
from abc import ABCMeta, abstractmethod
# Payment类是一个抽象产品角色,定义了支付方式的接口 pay。
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
pass
# 具体产品角色,实现了Payment类的支付宝支付方式即pay方法。
class Alipay(Payment):
def __init__(self, use_huabei=False):
self.use_huabei = use_huabei
def pay(self, money):
if self.use_huabei:
print("花呗支付%d元。" % money)
else:
print("支付宝余额支付了%d元。" % money)
# 具体产品角色,实现了Payment类的微信支付方式即pay方法。
class WechatPay(Payment):
def pay(self, money):
print("微信支付了%d元." % money)
# PaymentFactory 是工厂 Factory 类角色 - 负责根据条件创建具体的支付方式 实例
class PaymentFactory:
def create_payment(self, method):
if method == "Alipay":
return Alipay()
elif method == "WechatPay":
return WechatPay()
elif method == "HuabeiPay":
return Alipay(use_huabei=True)
else:
raise TypeError(f"No such payment named {method}")
# Client -- 客户端调用 - 示范了如何使用工厂类来获取和使用支付方式实例
pf = PaymentFactory() # 创建PaymentFactory类实例并将其赋值给pf变量
# PaymentFactory 类通过 create_payment 方法根据传入的方法名称来决定创建哪种支付方式的实例
p = pf.create_payment("HuabeiPay")
p.pay(199)
示例代码解析
Payment
类是一个抽象产品,定义了支付的接口pay
。Alipay
和WechatPay
是具体产品,它们实现了Payment
类的pay
方法。PaymentFactory
是工厂类,负责根据不同的条件(这里是支付方式的名称)来创建并返回具体的产品实例。