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

来源:互联网 发布:川大生活服务 网络 编辑:程序博客网 时间:2024/06/06 11:11

抽象工厂模式和工厂方法模式的区别是,后者一个工厂只生产一种产品,而前者是一个工厂可以生产多个产品。当然,这些产品之间是要有联系的,它们通常是一个整体产品的一部分,由工厂造出后再组装成一个完整的产品。网上经常用造汽车来做例子:车间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()
运行结果如下:

用户通过支付宝付款退款到支付宝查询支付宝支付状态用户通过微信支付付款退款到微信支付查询微信支付状态


总结:
抽象工厂模式的优点:做到了使各产品类职责单一,而且工厂类非常容易扩展,比如例子中再增加一个“银联支付”,只需要增加几个类就好。

抽象工厂模式的缺点:各个产品都组装在一个工厂里,增加产品种类的情况下(比如增加部分退款功能),改动会非常大,所有子工厂都要修改。所以抽象工厂模式适合产品族较稳定,不会经常变动的情况。

另外,从上面看出,虽然产品细分之后满足单一职责原则,但是使类数据增长的很快。后面我们介绍策略模式的时候,将会结合简单工厂模式来简化这种做法



阅读全文
0 0
原创粉丝点击