简单工厂模式
一种创建形设计模式
大概意思就是通过一个工厂类来创建对象实例,像工厂生产产品一样
举例
from abc import ABCMeta,abstractmethod
#这个类就是底层和上层的抽象
#这个就是抽象
class payment(object):
__metaclass__ = ABCMeta
@abstractmethod
def pay(self,money):
pass
#这两个支付类就是模拟底层的实现逻辑
#下面是细节
class AliPay(payment):
def pay(self,money):
print "支付宝支付%d" % money
pass
class WeChatPay(payment):
def pay(self,money):
pass
#工厂类,批量生产对象
class PaymentFactoryClass(object):
def create_payment_obj(self, pay_kind):
if pay_kind == "alipay":
return AliPay()
elif pay_kind == "wechat":
return WeChatPay()
else:
#没有这个支付模式
print "....."
#模拟上层调用逻辑
pf = PaymentFactoryClass()
p = pf.create_payment_obj("alipay")
p.pay(100)
#抽象不应该依赖于细节,细节应该依赖于抽象
工厂类可以生产对象,然后通过对象来调用接口,好处是隐藏了对用户隐藏了如何创建对象的细节,直接用工厂创建完事了,比如支付宝类要扩展支付种类,添加花呗支付
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 PaymentFactoryClass(object):
def create_payment_obj(self, pay_kind):
if pay_kind == "alipay":
return AliPay()
elif pay_kind == "wechat":
return WeChatPay()
elif pay_kind == "huabei":
return AliPay(use_huabie=True) #增加花呗支付
else:
#没有这个支付模式
print "....."
#模拟上层调用逻辑
pf = PaymentFactoryClass()
p = pf.create_payment_obj("huabei")
p.pay(100)
就是说client只用关心传入的支付种类参数就可以了,不用关心Alipay是怎么创建对象的
缺点:
- 违反单一职责原则,工厂成为一个总接口
- 添加东西是,修改了工厂类,违反了开闭原则