一、简单工厂模式
描述:不直接像客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品的实例
缺点:违反了单一原则,将创建逻辑放到了一个工厂类里;当添加新产品时,需要修改工厂类代码,违反了开闭原则
案例:微信支付和支付宝支付
from abc import ABCMeta, abstractmethod# 抽象产品角色class Payment(metaclass=ABCMeta):@abstractmethoddef 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, abstractmethodclass Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):raise NotImplementedErrorclass Alipay(Payment):def pay(self, money):print(f'支付宝支付{money}元')class Wechat(Payment):def pay(self, money):print(f'微信支付{money}元')class PaymentFactory(metaclass=ABCMeta):@abstractmethoddef creat_payment(self):raise NotImplementedErrorclass AlipayFactory(PaymentFactory):def creat_payment(self):return Alipay()if __name__ == '__main__':p = AlipayFactory()p1 = p.creat_payment()p1.pay(30)
