工厂方法模式
工厂方法模式纠正了简单工厂模式违反的单一职责原则和开闭原则,把工厂类也抽象出来,让抽象类的子类去决定实例化哪个产品
 例子:
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()
在加了功能以后,并没有对抽象类进行修改,对扩展开放了,对修改关闭了
 缺点:代码太多,增加一个产品,就得添加一个工厂类









