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()
运行结果如下:
用户通过支付宝付款
退款到支付宝
查询支付宝支付状态
用户通过微信支付付款
退款到微信支付
查询微信支付状态
总结:
抽象工厂模式的优点:做到了使各产品类职责单一,而且工厂类非常容易扩展,比如例子中再增加一个“银联支付”,只需要增加几个类就好。
抽象工厂模式的缺点:各个产品都组装在一个工厂里,增加产品种类的情况下(比如增加部分退款功能),改动会非常大,所有子工厂都要修改。所以抽象工厂模式适合产品族较稳定,不会经常变动的情况。
另外,从上面看出,虽然产品细分之后满足单一职责原则,但是使类数据增长的很快。后面我们介绍策略模式的时候,将会结合简单工厂模式来简化这种做法
抽象工厂模式的好处是将产品类拆分为不同的子类,尽量去满足单一职责原则,同时,又将它们约束在一个工厂里,是一个“高内聚”的良好模式。
这次,我们用具体项目中的例子来实践。基本上每个互联网公司,都必然要提供支付功能(不然怎么挣钱),我们简化支付包含如下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()
运行结果如下:
用户通过支付宝付款
退款到支付宝
查询支付宝支付状态
用户通过微信支付付款
退款到微信支付
查询微信支付状态
总结:
抽象工厂模式的优点:做到了使各产品类职责单一,而且工厂类非常容易扩展,比如例子中再增加一个“银联支付”,只需要增加几个类就好。
抽象工厂模式的缺点:各个产品都组装在一个工厂里,增加产品种类的情况下(比如增加部分退款功能),改动会非常大,所有子工厂都要修改。所以抽象工厂模式适合产品族较稳定,不会经常变动的情况。
另外,从上面看出,虽然产品细分之后满足单一职责原则,但是使类数据增长的很快。后面我们介绍策略模式的时候,将会结合简单工厂模式来简化这种做法
相关文章推荐
- 我所理解的设计模式(C++实现)——抽象工厂模式(Abstract Factory Pattern)
- 我所理解的设计模式(C++实现)——抽象工厂模式(Abstract Factory Pattern)
- [创建型模式系列]Abstract factory of Design Pattern模式设计之抽象工厂模式
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
- 解读设计模式----抽象工厂模式(AbstractFactory Pattern)
- 设计模式学习总结-抽象工厂模式(Abstract Factory Pattern)
- c++设计模式:抽象工厂模式(Abstract Factory Pattern)
- 设计模式(三)抽象工厂模式(Abstract Factory Pattern)
- 五.创建型设计模式——Abstract Factory Pattern(抽象工厂模式)
- Net设计模式之抽象工厂模式(Abstract Factory Pattern)
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
- 设计模式学习总结-抽象工厂模式(Abstract Factory Pattern)
- Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)
- 设计模式——抽象工厂模式【Abstract Factory Pattern】
- Net设计模式之抽象工厂模式(Abstract Factory Pattern)(1)
- 设计模式 - Abstract Factory Pattern(抽象工厂模式)
- 极速理解设计模式系列:10.抽象工厂模式(Abstract Factory Pattern)
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
- 设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
- 解读设计模式----抽象工厂模式(AbstractFactory Pattern)