💖 作者:大家好,我是阿旭😜
🎉 支持我:点赞👍收藏⭐️留言📝
📣 系列专栏:23种设计模式详解-Python 🍁
工厂方法模式
亦称:虚拟构造函数、Virtual Constructor、Factory Method
工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
定义一个用于创建对象的接口(工厂接口),让子类决定实例化哪一个产品类
包含的角色
- 1.抽象产品角色
- 2.具体产品角色
- 3.抽象工厂角色
- 4.具体工厂角色
具体实现
如果说我们现在需要做支付的业务,那如何使用工厂方法模式来书写我们的代码呢?
ABCMeta、abstractmethod
from abc import ABCMeta, abstractmethod
在正式开始之前我先来给大家讲一下ABCMeta和abstractmethod,这两个方法来自于Python中的abc模块,该模块提供了在 Python 中定义抽象基类 (ABC) 的组件。
当一个类继承ABCMeta元类时,则证明此类被定义成了一个抽象类。并且当类中的方法添加了abstractmethod装饰器时,则证明此方法是其子类中需要必须实现的方法。
接下来我们来看如何定义这四种角色:
1.抽象产品角色
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
pass
在这段代码中我们定义了一个抽象类Payment,并且定义了一个抽象方法pay。当所有的具体产品角色在继承Payment时,必须实现统一的pay方法。
2.具体产品角色
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)
在此段代码中我们定义了两种支付产品分别为AliPay和WechatPay,他们都继承了Payment抽象类并重新定义了pay方法。
3.抽象工厂角色
class PaymentFactory(metaclass=ABCMeta):
@abstractmethod
def create_payment(self):
pass
抽象工厂PaymentFactory的作用是用来创建不同类型的支付对象,所以我们在其内部定义了抽象方法create_payment。
4.具体工厂角色
class AliFactory(CreatePayment):
def create_payment(self):
return AliPay()
class HuabeiFactory(CreatePayment):
def create_payment(self):
return AliPay(use_huabei=True)
class WechatFactory(CreatePayment):
def create_payment(self):
return WechatPay()
我们可以通过不同的工厂来创建不同的支付产品。
pf = HuabeiFactory()
p = pf.create_payment()
p.pay(100)
Output:
优点和缺点
优点:
1.隐藏了对象创建的具体细节。
2.客户端不需要修改代码。
缺点:
1.每增加一个具体产品类,就需要增加一个相应的具体工厂类。
🎉 支持我:点赞👍收藏⭐️留言📝
📣 系列专栏:23种设计模式详解-Python 🍁
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)