1 概述
简单工厂模式是一种创造型模式。
不直接向高层代码暴露对象创建的实现细节,通过工厂类来负责创建产品类实例。
角色
工厂角色 (Creator)
抽象产品角色 (Product)
具体产品角色(Concrete Product)
2 代码实现
from abc import ABCMeta, abstractmethod
class Payment(metaclass=ABCMeta):
"""
抽象类 定义统一接口类型
"""
@abstractmethod
def pay(self, money):
pass
class Alipay(Payment):
"""
具体产品角色类,继承抽象类
"""
def __init__(self,is_huabei=False):
self.is_huabei = is_huabei
def pay(self, money):
if self.is_huabei:
print(f"使用花呗支付了:{money}")
else:
print(f"使用支付宝支付了:{money}")
class Wechatpay(Payment):
"""
具体产品角色类,继承抽象类
"""
def pay(self, money):
print(f"使用微信支付了:{money}")
class PaymentFactory:
"""
工厂角色
"""
def create_payment(self, method):
"""
创建对象函数,传递一个参数,这个参数决定使用哪个具体产品类的对象
对象的初始化方法中可以在if语句中传递不同的参数
即使时相同的类,可以通过控制初始化的参数不同提供不同的对象
总之,工厂类向高层代码隐藏了对象创造的细节
"""
if method == 'alipay':
return Alipay()
elif method == 'wechat':
return Wechatpay()
elif method == 'huabei':
return Alipay(is_huabei=True)
else:
raise TypeError(f"No this pay method {method}")
# 高层代码
if __name__ == '__main__':
pf = PaymentFactory()
p = pf.create_payment('huabei')
p.pay(100)
3 优势/劣势
优势
隐藏了对象创建的实现细节;
客户端不需要修改代码
劣势
违反了单一职责原则,将所有创建逻辑放到一个工厂类中
当添加新产品时,需要修改工厂类,违反了开闭原则