0
点赞
收藏
分享

微信扫一扫

设计模式-工厂方法模式

工厂方法模式

工厂方法模式纠正了简单工厂模式违反的单一职责原则和开闭原则,把工厂类也抽象出来,让抽象类的子类去决定实例化哪个产品
例子:

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()

在加了功能以后,并没有对抽象类进行修改,对扩展开放了,对修改关闭了
缺点:代码太多,增加一个产品,就得添加一个工厂类

举报

相关推荐

0 条评论