【python设计模式2】创建型模式1
目录
简单工厂模式
工厂方法模式
简单工厂模式
简单工厂模式不是23中设计模式中的,但是必须要知道。简单工厂模式不直接向客户端暴露对象创建的细节,而是通过一个工厂类来负责创建产品类的实例。简单工程模式的角色有:工厂角色、抽象产品角色、具体产品角色,通过例子来加深理解:
from abc import ABCMeta, abstractmethod# 抽象产品角色,以什么样的表现去使用
class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):pass# 产品角色
class Alipay(Payment):def __init__(self, use_huabei=False):self.use_huabei = use_huabeidef pay(self, money):if self.use_huabei == True:print("花呗支付了{0}元!".format(money))else:print("支付宝余额支付了{0}元!".format(money))# 产品角色
class WechatPay(Payment):def pay(self, money):print("微信支付了%d元!" % (money))# 工厂类角色
class PaymentFactory:def ctreate_payment(self, method):if method == 'Alipay':return Alipay()elif method == 'WechatPay':return WechatPay()elif method == 'HuabeiPay':return Alipay(use_huabei=True)else:raise TypeError('No such payment named %s' % method)# 客户端调用。不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例
pf = PaymentFactory()
p = pf.ctreate_payment('HuabeiPay')
p.pay(100)
工厂方法模式
简单工厂模式只创建一个工厂类,当有新的产品时,需要修改工厂类代码。而 工厂方法模式的每个具体产品对应一个具体的工厂类,不需要修改工厂类代码,并且同时也能满足隐藏对象创建的细节
。但是工厂方法模式也是有缺点的,就是 每增加一个具体产品类,就必须增加一个相应的具体方法
。 工厂模式方法模式的概念是定义了一个用于创建对象的接口(工厂接口),让子类决定实例化那一个产品类。角色有抽象工厂角色、具体工厂角色、抽象产品角色和具体产品角色。通过例子来加深理解,每个具体产品对应一个具体的工厂类:
from abc import ABCMeta, abstractmethod# 抽象产品角色
class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):pass# 具体产品角色
class Alipay(Payment):def __init__(self, use_huabei=False):self.use_huabei = use_huabeidef pay(self, money):if self.use_huabei == True:print("花呗支付了{0}元!".format(money))else:print("支付宝余额支付了{0}元!".format(money))class WechatPay(Payment):def pay(self, money):print("微信支付了%d元!" % (money))# 抽象工厂角色
class PaymentFactory(metaclass=ABCMeta):@abstractmethoddef create_payment(self):pass# 具体工厂角色
class AlipayFactory(PaymentFactory):def create_payment(self):return Alipay()class WechatPayFactory(PaymentFactory):def create_payment(self):return Alipay()class HuabeiFactory(PaymentFactory):def create_payment(self):return Alipay(use_huabei=True)hfp = HuabeiFactory().create_payment()
hfp.pay(100) # 花呗支付了100元!
缺点是每增加一个具体产品类,就必须增加一个相应的具体方法:
from abc import ABCMeta, abstractmethodclass Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):passclass Alipay(Payment):def __init__(self, use_huabei=False):self.use_huabei = use_huabeidef pay(self, money):if self.use_huabei == True:print("花呗支付了{0}元!".format(money))else:print("支付宝余额支付了{0}元!".format(money))class WechatPay(Payment):def pay(self, money):print("微信支付了%d元!" % (money))class BankPay(Payment):def pay(self, money):print("银行支付了%d元!" % (money))# 创建产品的工厂类的接口
class PaymentFactory(metaclass=ABCMeta):@abstractmethoddef create_payment(self):pass# 工厂类
class AlipayFactory(PaymentFactory):def create_payment(self):return Alipay()# 工厂类
class WechatPayPayFactory(PaymentFactory):def create_payment(self):return Alipay()# 工厂类
class HuabeiPayFactory(PaymentFactory):def create_payment(self):return Alipay(use_huabei=True)# 新增加银行支付的工厂类
class BankPayFactory(PaymentFactory):def create_payment(self):return BankPay()bfp = BankPayFactory().create_payment()
bfp.pay(100) # 银行支付了100元!