1 概述
工厂方法模式是简单工厂模式进化而来的,简单工厂模式在一个创建方法中创建了多个对象,当需要增加新“产品”的时候,需要修改工厂类的工厂方法。
工厂方法模式将简单工厂模式中的创造方法拆开,让一个工厂方法只创造一个对象。
角色
抽象工厂角色:PaymentFactory
具体工厂角色:
抽象产品角色:
具体产品角色:Payment
2 代码实现
from abc import ABCMeta, abstractmethod
class Payment(metaclass=ABCMeta):
"""
抽象类 定义统一接口类型
"""
@abstractmethod
def pay(self, money):
pass
class Alipay(Payment):
"""
具体产品角色类,继承抽象类
"""
def __init__(self,is_huabei=False):
self.is_huabei = is_huabei
def pay(self, money):
if self.is_huabei:
print(f"使用花呗支付了:{money}")
else:
print(f"使用支付宝支付了:{money}")
class Wechatpay(Payment):
"""
具体产品角色类,继承抽象类
"""
def pay(self, money):
print(f"使用微信支付了:{money}")
class PaymentFactory(metaclass=ABCMeta):
"""
定义工厂类接口,规范工厂类
"""
@abstractmethod
def create_payment(self):
pass
class AlipayFactory(PaymentFactory):
"""
创建一个阿里支付工厂类,这个类只负责阿里支付的相关实现
"""
def create_payment(self):
return Alipay()
class WechatpayFactory(PaymentFactory):
"""
创建一个微信支付工厂类
"""
def create_payment(self):
return Wechatpay()
class HuabeipayFactory(PaymentFactory):
"""
创建一个花呗支付工厂类
"""
def create_payment(self):
return Alipay(is_huabei=True)
if __name__ == '__main__':
alifac = AlipayFactory()
alipay = alifac.create_payment()
alipay.pay(100)
huafac = HuabeipayFactory()
huabei = huafac.create_payment()
huabei.pay(100)
"""
OUT:
使用支付宝支付了:100
使用花呗支付了:100
"""
如果新增一个新产品
需要增加两个类,一个产品类,和一个创建该产品的工厂类,比如我增加一个银联支付产品,需要做如下操作:
class BankPay(Payment):
"""
定义一个银联支付产品类
"""
def pay(self, money):
print(f"使用银联支付了:{money}")
class BankpayFactory(PaymentFactory):
def create_payment(self):
return BankPay()
if __name__ == "__main__":
bankfac = BankpayFactory()
bankpay = bankfac.create_payment()
bankpay.pay(100)
"""
OUT:
使用银联支付了:100
"""
3 优势&缺点
优势
每个具体产品都对应一个具体工厂类,不需要修改具体工厂类代码
隐藏了对象创建的实现细节
缺点
每增加一个具体的产品类,就必须增加一个相应的具体工厂类