python设计模式--简单工厂模式
简单工厂模式
内容
不直接向客户暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。
角色
工厂角色
抽象产品角色
具体产品角色
优点
隐藏类对象创建的实现细节
客户端不需要修改代码
缺点
违反类单一职责原则,将创建逻辑集中到一个工厂类里
当添加新产品时,需要修改工厂类的代码,违反了开闭原则
简单工厂模式的不足:
在简单工厂模式中,只提供了一个工厂类,该工厂类处于对产品类进行实例化的中心位置,
它知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。
简单工厂模式最大的缺点是当有新产品要加入到系统中时,必须修改工厂类,
加入必要的处理逻辑,这违背了“开闭原则”。在简单工厂模式中,所有的产品都是由同一个工厂创建,
工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,
严重影响了系统的灵活性和扩展性,而工厂方法模式则可以很好地解决这一问题。
class Payment(metaclass=ABCMeta): # 抽象产品角色
@abstractmethod
def pay(self, money):
pass
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)
class WechatPay(Payment):
def pay(self, money):
print('微信支付%d元.' % money)
class BankPay(Payment):
def pay(self, money):
print('银行卡支付%d元.' % money)
print('---------------------------------------------')
class PaymentFactory: # 工厂角色
def create_payment(self, method):
if method == 'alipay':
return Alipay()
elif method == 'wechat':
return WechatPay()
elif method == 'huabei':
return Alipay(use_huabei=True)
else:
raise TypeError('No such payment named %s' % method)
#client
pf = PaymentFactory()
p = pf.create_payment('huabei')
p.pay(100)