一、简单工厂模式
描述:不直接像客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品的实例
缺点:违反了单一原则,将创建逻辑放到了一个工厂类里;当添加新产品时,需要修改工厂类代码,违反了开闭原则
案例:微信支付和支付宝支付
from abc import ABCMeta, abstractmethod
# 抽象产品角色
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
raise NotImplementedError
# 具体产品角色
class Alipay(Payment):
def pay(self, money):
print(f'支付宝支付{money}元')
# 具体产品角色
class Wechat(Payment):
def pay(self, money):
print(f'微信支付{money}元')
# 工厂角色
class PaymenFactory:
def creatpay(self, classmethod):
if classmethod == 'alipay':
return Alipay()
elif classmethod == 'wechatpay':
return Wechat()
else:
return TypeError('支付类型错误')
p = PaymenFactory()
p1 = p.creatpay('alipay')
p1.pay(20)
二、工厂模式
描述:定义一个用于创建对象的工厂接口,让自类决定实例话哪一个产品类;每个具体的产品都有一个具体工厂类,不需要修改工厂类代码
缺点:每增加一个具体产品类,就必须增加一个相应的具体工厂类
案例:还是支付类型案例
from abc import ABCMeta, abstractmethod
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
raise NotImplementedError
class Alipay(Payment):
def pay(self, money):
print(f'支付宝支付{money}元')
class Wechat(Payment):
def pay(self, money):
print(f'微信支付{money}元')
class PaymentFactory(metaclass=ABCMeta):
@abstractmethod
def creat_payment(self):
raise NotImplementedError
class AlipayFactory(PaymentFactory):
def creat_payment(self):
return Alipay()
if __name__ == '__main__':
p = AlipayFactory()
p1 = p.creat_payment()
p1.pay(30)