工厂方法模式
工厂方法模式纠正了简单工厂模式违反的单一职责原则和开闭原则,把工厂类也抽象出来,让抽象类的子类去决定实例化哪个产品
例子:
from abc import ABCMeta,abstractmethod
#抽象产品角色
class payment(object):
__metaclass__ = ABCMeta
@abstractmethod
def pay(self,money):
pass
#具体产品角色
class AliPay(payment):
def __init__(self, use_huabie = False):
self.use_huabei = use_huabie
def pay(self,money):
if not self.use_huabei:
print "支付宝支付%d" % money
else:
print "支付宝花呗支付%d" % money
class WeChatPay(payment):
def pay(self,money):
pass
#抽象工厂角色
class PymentFactory(object):
__metaclass__ = ABCMeta
@abstractmethod
def create_payment_obj(self):
#抽象类规定所有子类都要实现这个方法
pass
#具体工厂角色
class AliPayFactory(PymentFactory):
def create_payment_obj(self):
return AliPay()
class WeChatFactory(PymentFactory):
def create_payment_obj(self):
return WeChatPay()
class HuaBeiFactory(PymentFactory):
def create_payment_obj(self):
return AliPay(use_huabie=True)
#模拟上层调用逻辑
pf = AliPayFactory()
p = pf.create_payment_obj()
p.pay(100)
- 为什么说纠正了单一职责原则呢,因为上面吧工厂类抽象了出来,然后针对产品编写了单独的接口,不存在有一个总接口然后在接口里面判断
- 为什么说纠正了开闭原则呢,看下面的例子,比如我们要再加一个银行卡支付
#我们只需要加一个银行支付的具体产品类
class BankPay(payment):
def pay(self,money):
pass
#然后加一个银行卡支付的具体工厂角色
class BankFactory(PymentFactory):
def create_payment_obj(self):
return BankFactory()
在加了功能以后,并没有对抽象类进行修改,对扩展开放了,对修改关闭了
缺点:代码太多,增加一个产品,就得添加一个工厂类