• 内容:定义一个用于创建对象的接口(工厂接口),让子类决定实例化哪一个产品类。
    • 角色:
      • 抽象工厂角色(Creator)
      • 具体工厂角色(Concrete Creator)
      • 抽象产品角色(Product)
      • 具体产品角色(Concrete Product)
    • 工厂方法模式相比简单工厂模式将每个具体产品都对应了一个具体工厂。

    未命名文件.png

    1. from abc import abstractmethod, ABCMeta
    2. class Payment(metaclass=ABCMeta):
    3. " 抽象产品角色(Product)"
    4. @abstractmethod
    5. def pay(self, money):
    6. raise NotImplementedError
    7. # 具体产品角色(Concrete Product)
    8. class Alipay(Payment):
    9. def pay(self, money):
    10. print("支付宝支付%s元" % money)
    11. class Applepay(Payment):
    12. def pay(self, money):
    13. print("苹果支付%s元" % money)
    14. class PaymentFactory(metaclass=ABCMeta):
    15. "抽象工厂角色(Creator)"
    16. @abstractmethod
    17. def create_payment(self):
    18. raise NotImplementedError
    19. # 具体工厂角色(Concrete Creater)
    20. class AlipayFactory(PaymentFactory):
    21. def create_payment(self):
    22. return Alipay()
    23. class ApplepaytFactory(PaymentFactory):
    24. def create_payment(self):
    25. return Applepay()
    26. a = AlipayFactory()
    27. ali = a.create_payment()
    28. ali.pay(100)
    • 适用场景:
      • 需要生产多种、大量复杂对象的时候。
      • 需要降低耦合度的时候
      • 当系统中的产品种类需要经常扩展的时候
    • 优点:
      • 每个具体产品都对应一个具体工厂类,不需要修改工厂类代码
      • 工厂类可以不知道它创建的对象的类。
      • 隐藏了对象创建的实现细节。
    • 缺点:
      • 每增加一个产品类,就必须增加一个相应的具体工厂类。