简单工厂模式

不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例

from abc import ABCMeta, abstractmethod

# 抽象产品角色(Product)
class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self, money):
        pass

# 具体产品角色(Concrete Product)
class AliPay(Payment):
    def __init__(self, use_huabei=False):
        self.use_huabei = use_huabei

    def pay(self, money):
        if self.use_huabei:
            print('花呗支付%d元' % money)
        else:
            print('支付宝余额支付%d元' % money)

# 具体产品角色(Concrete Product)
class WechatPay(Payment):
    def pay(self, money):
        print('微信支付%d元' % money)

# 工厂角色(Creator)
class PaymentFactory(object):
    def create_payment(self, method):
        # 隐藏细节
        if method == 'ali':
            # 用户完全不用传递的参数,在工厂里传入
            return AliPay()
        elif method == 'wechat':
            # 或 ali 与 wechat 相同功能 不同格式的参数,如json,xml
            return WechatPay()

        # 新增一种选项,调用时只是选项值增加,而不是参数增加 ********
        elif method == 'huabei':
            return AliPay(use_huabei=True)
        else:
            return None

pf = PaymentFactory()
p = pf.create_payment('huabei')
p.pay(1000)

优点:

  • 隐藏了对象创建的实现细节

  • 客户端不需要修改代码

缺点:

  • 违反了单一职责原则,将创建逻辑集中到一个工厂类里

  • 当添加新产品时,需要修改工厂类代码,违反了开闭原则

Last updated