一、简单工厂模式

描述:不直接像客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品的实例
缺点:违反了单一原则,将创建逻辑放到了一个工厂类里;当添加新产品时,需要修改工厂类代码,违反了开闭原则
案例:微信支付和支付宝支付

  1. from abc import ABCMeta, abstractmethod
  2. # 抽象产品角色
  3. class Payment(metaclass=ABCMeta):
  4. @abstractmethod
  5. def pay(self, money):
  6. raise NotImplementedError
  7. # 具体产品角色
  8. class Alipay(Payment):
  9. def pay(self, money):
  10. print(f'支付宝支付{money}元')
  11. # 具体产品角色
  12. class Wechat(Payment):
  13. def pay(self, money):
  14. print(f'微信支付{money}元')
  15. # 工厂角色
  16. class PaymenFactory:
  17. def creatpay(self, classmethod):
  18. if classmethod == 'alipay':
  19. return Alipay()
  20. elif classmethod == 'wechatpay':
  21. return Wechat()
  22. else:
  23. return TypeError('支付类型错误')
  24. p = PaymenFactory()
  25. p1 = p.creatpay('alipay')
  26. p1.pay(20)

二、工厂模式

描述:定义一个用于创建对象的工厂接口,让自类决定实例话哪一个产品类;每个具体的产品都有一个具体工厂类,不需要修改工厂类代码
缺点:每增加一个具体产品类,就必须增加一个相应的具体工厂类
案例:还是支付类型案例

  1. from abc import ABCMeta, abstractmethod
  2. class Payment(metaclass=ABCMeta):
  3. @abstractmethod
  4. def pay(self, money):
  5. raise NotImplementedError
  6. class Alipay(Payment):
  7. def pay(self, money):
  8. print(f'支付宝支付{money}元')
  9. class Wechat(Payment):
  10. def pay(self, money):
  11. print(f'微信支付{money}元')
  12. class PaymentFactory(metaclass=ABCMeta):
  13. @abstractmethod
  14. def creat_payment(self):
  15. raise NotImplementedError
  16. class AlipayFactory(PaymentFactory):
  17. def creat_payment(self):
  18. return Alipay()
  19. if __name__ == '__main__':
  20. p = AlipayFactory()
  21. p1 = p.creat_payment()
  22. p1.pay(30)

三、抽象工厂模式