您的位置:首页 > 编程语言 > Python开发

Python实现设计模式--03.抽象工厂模式(Abstract Factory Pattern)

2017-07-31 23:06 676 查看
抽象工厂模式和工厂方法模式的区别是,后者一个工厂只生产一种产品,而前者是一个工厂可以生产多个产品。当然,这些产品之间是要有联系的,它们通常是一个整体产品的一部分,由工厂造出后再组装成一个完整的产品。网上经常用造汽车来做例子:车间A生产车身、车间B生产车门、车间C生产轮子,工厂造出它们后,就得到一部完整的汽车了。

抽象工厂模式的好处是将产品类拆分为不同的子类,尽量去满足单一职责原则,同时,又将它们约束在一个工厂里,是一个“高内聚”的良好模式。

这次,我们用具体项目中的例子来实践。基本上每个互联网公司,都必然要提供支付功能(不然怎么挣钱),我们简化支付包含如下3种功能:用户付款、退款、查询支付状态。下面定义3中功能的抽象接口:

# 用户付款功能(抽象产品类)
class UserPayFunction:
def pay(self):
pass

# 退款功能(抽象产品类)
class RefundFunction:
def refund(self):
pass

# 查询支付状态功能(抽象产品类)
class QueryPayFunction:
def query(self):
pass
公司通常也不会只有一种支付渠道,假设有支付宝支付和微信支付两种方式,那么,上面三个功能每个都有两种实现,代码如下:
# 用户付款功能,支付宝(具体产品)
class AlipayUserPayFunction(UserPayFunction):
def pay(self):
print("用户通过支付宝付款")

# 用户付款功能,微信支付(具体产品)
class WxpayUserPayFunction(UserPayFunction):
def pay(self):
print("用户通过微信支付付款")

# 退款功能,支付宝(具体产品)
class AlipayRefundFunction(RefundFunction):
def refund(self):
print("退款到支付宝")

# 退款功能,微信支付(具体产品)
class WxpayRefundFunction(RefundFunction):
def refund(self):
print("退款到微信支付")

# 查询支付状态功能,支付宝(具体产品)
class AlipayQueryPayFunction:
def query(self):
print("查询支付宝支付状态")

# 查询支付状态功能,微信支付(具体产品)
class WxpayQueryPayFunction:
def query(self):
print("查询微信支付状态")
下面定义生产3个功能的抽象工厂,以及两个实现工厂:
# 抽象支付工厂
class AbstractPaymentFactory:
def createUserPayFunction(self):
pass

def createRefundFunction(self):
pass

def createQueryPayFunction(self):
pass

# 支付宝支付工厂
class AlipayPaymentFactory:
def createUserPayFunction(self):
return AlipayUserPayFunction()

def createRefundFunction(self):
return AlipayRefundFunction()

def createQueryPayFunction(self):
return AlipayQueryPayFunction()

# 微信支付工厂
class WxpayPaymentFactory:
def createUserPayFunction(self):
return WxpayUserPayFunction()

def createRefundFunction(self):
return WxpayRefundFunction()

def createQueryPayFunction(self):
return WxpayQueryPayFunction()
最后,模拟场景调用:
if __name__ == '__main__':
paymentFactory1 = AlipayPaymentFactory()
paymentFactory2 = WxpayPaymentFactory()

userPayFunction1 = paymentFactory1.createUserPayFunction()
refundFunction1 = paymentFactory1.createRefundFunction()
queryPayFunction1 = paymentFactory1.createQueryPayFunction()

userPayFunction2 = paymentFactory2.createUserPayFunction()
refundFunction2 = paymentFactory2.createRefundFunction()
queryPayFunction2 = paymentFactory2.createQueryPayFunction()

userPayFunction1.pay()
refundFunction1.refund()
queryPayFunction1.query()

userPayFunction2.pay()
refundFunction2.refund()
queryPayFunction2.query()
运行结果如下:
用户通过支付宝付款
退款到支付宝
查询支付宝支付状态
用户通过微信支付付款
退款到微信支付
查询微信支付状态


总结:

抽象工厂模式的优点:做到了使各产品类职责单一,而且工厂类非常容易扩展,比如例子中再增加一个“银联支付”,只需要增加几个类就好。
抽象工厂模式的缺点:各个产品都组装在一个工厂里,增加产品种类的情况下(比如增加部分退款功能),改动会非常大,所有子工厂都要修改。所以抽象工厂模式适合产品族较稳定,不会经常变动的情况。

另外,从上面看出,虽然产品细分之后满足单一职责原则,但是使类数据增长的很快。后面我们介绍策略模式的时候,将会结合简单工厂模式来简化这种做法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式 python