创建一个对象的时候
内容: 不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例
角色
工厂角色 (Creator)
抽象产品角色 (Product)
具体产品角色 (Concrete Product)
高层代码就是前端工程师
工厂生产产品的 工厂类就是生产对象 对象就是产品
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self,money):
pass
class Alipay(Payment):
def pay(self,money):
print("支付宝%d元." % money)
class WechatPay(Payment):
def pay(self,money):
print("微信支付%d元." % money)
class PaymentFactory:
def create_payment(self,method):
if method == 'alipay':
return Alipay()
elif mehtod == 'wechat':
return WechatPay()
else:
raise TypeError("No such payment named %s" % method)
# client
pf = PaymentFactory()
p = pf.create_payment('alipay')
p.pay(100)
[root@hadoop000 ~]# python3 sheji.py
支付宝100元.
好处:
- 参数要是统一传进去,例如 id ,pass证书,这样一来就是统一
def create_payment(self,method,id,pass): - return Alipay() 例如:如果阿里云用的是utf8, WechatPay用的是gbk,这样的过程就可以隐藏各子的方法里面 ,如果我没有写。就需要自己去走,自己去了解读代码,如果报错。可能方法里面还要判断
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self,money):
pass
class Alipay(Payment):
#如果不写工厂方法,就要知道这有一个参数,这个参数表式开启,还会有其它
def __init__(self,use_huobei=False):
self.use_huaei = use_huobei
def pay(self,money):
if self.use_huaei:
print("花呗支付%d元." % money)
else:
print("支付宝余额支付%d.元" % money)
class WechatPay(Payment):
def pay(self,money):
print("微信支付%d元." % money)
class PaymentFactory:
def create_payment(self,method):
if method == 'alipay':
return Alipay()
elif method == 'wechat':
return WechatPay()
elif method == 'huabei':
#客户端就不用知道知道这个参数了
return Alipay(use_huobei=True)
else:
raise TypeError("No such payment named %s" % method)
# client 这样高曾代码就不用读你的逻辑了
pf = PaymentFactory()
p = pf.create_payment('huabei')
p.pay(100)
优点:
- 隐藏了对象创建的实现细节
- 客户端不需要修改代码
缺点:
- 违反了单一职责原则,将创建逻辑几种到一个工厂里
- 当添加了新产品时,需要修改工厂类代码,违反了开闭原则