1.定义
每个具体产品对应一个具体的工厂类,工厂类中包含生产该产品的全套方法。
2.具体角色
抽象产品角色
具体产品角色
抽象工厂角色
具体工厂角色
from abc import ABCMeta, abstractclassmethod, abstractmethod
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
pass
# 具体产品角色
class Alipay(Payment):
def pay(self, money):
print("支付宝余额支付{}".format(money))
class WechatPay(Payment):
def pay(self,money):
print("微信余额支付{}".format(money))
# 抽象工厂角色
class PaymentFactory(metaclass=ABCMeta):
@abstractmethod
def create_payment(self):
pass
# 具体工厂角色
class AlipayFactory(PaymentFactory):
def create_payment(self):
return Alipay()
class WechatFactory(PaymentFactory):
def create_payment(self):
return WechatPay()
if __name__ == '__main__':
ali = AlipayFactory().create_payment()
ali.pay(1000)
3.优缺点
优点:
相比于简单工厂模式的只创建一个工厂类,当有新的产品时,需要修改工厂类代码,而 工厂方法模式的每个具体产品对应一个具体的工厂类,不需要修改工厂类代码,并且同时也能满足隐藏对象创建的细节
。
缺点:
就是 每增加一个具体产品类,就必须增加一个相应的具体方法
。例如:增加一个花呗的支付模式:
from abc import ABCMeta, abstractclassmethod, abstractmethod
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
pass
# 具体产品角色
class Alipay(Payment):
def __init__(self,use_huabel=False):
self.use_huabel = use_huabel
def pay(self, money):
if self.use_huabel:
print("支付宝花呗支付{}".format(money))
else:
print("支付宝余额支付{}".format(money))
class WechatPay(Payment):
def pay(self,money):
print("微信余额支付{}".format(money))
# 抽象工厂角色
class PaymentFactory(metaclass=ABCMeta):
@abstractmethod
def create_payment(self):
pass
# 具体工厂角色
class AlipayFactory(PaymentFactory):
def create_payment(self):
return Alipay()
class WechatFactory(PaymentFactory):
def create_payment(self):
return WechatPay()
class HuabeiFactory(PaymentFactory):
def create_payment(self):
return Alipay(use_huabel=True)
if __name__ == '__main__':
huabei = HuabeiFactory().create_payment()
huabei.pay(1000)
代码稍显冗余。