当前位置:   article > 正文

python与设计模式之工厂模式的那些事儿

python与设计模式之工厂模式的那些事儿

一、工厂模式
工厂模式实现了按需创建的最佳模式,其目的是为了隐藏创建类的细节与过程,通过一个统一的接口来创建所需的对象。

话说没了皇位争夺权的皇三接到了一个外征的工作,始皇给了5个亿的经费让皇三组建一个军队。打权总是要进行武器采购。

说到武器,那可以是皇大的生意,N久以前,皇大就私下建了一个简单的生产工厂,被给每条生产线设置口令。目前皇大只有三条生产线,口令分别是:"皇大威武",“皇大千秋”,“皇大万岁”对应的“刀类,矛类,枪类”

皇三这天闲来无事,来到武器店里订购由武器(刀类,矛类,枪类)等。

皇三对着一堆武器,懵逼了,不知道哪个好。这时,皇大的掌柜要求皇三提供生产口令。

  1. import abc # abstract class
  2. from abc import abstractmethod
  3. class Product(metaclass=abc.ABCMeta):#拿到生产武器的生产资质及技术
  4. @abstractmethod
  5. def fabricate(): #定义能够生产武器的方法
  6. pass
  7. #引进刀类,矛类,枪类的生产线
  8. class ProductBittool(Product):#刀类生产线
  9. def fabricate(self):#生产工艺
  10. print("我是刀类生产线,正在生产刀具")
  11. class ProductSpear(Product):#mao矛类生产线
  12. def fabricate(self):#生产工艺
  13. print("我是矛类生产线,正在生产矛具")
  14. class ProductGun(Product):#刀类生产线
  15. def fabricate(self):#生产工艺
  16. print("我是枪类生产线,正在生产枪具")
  17. class SimpleFactory():
  18. def create_product(product_type):
  19. if product_type == "HDWW":
  20. return ProductBittool()
  21. elif product_type == "HDQQ":
  22. return ProductSpear()
  23. elif product_type == "HDWS":
  24. return ProductGun()
  25. else:
  26. print('你的要求非法,我们不能提供')
  27. product_a = SimpleFactory.create_product("HDWW")
  28. product_b = SimpleFactory.create_product("HDQQ")
  29. product_c = SimpleFactory.create_product("CLQQ")
  30. print("======我是有底线的======")
  31. product_a.fabricate()
  32. product_b.fabricate()
  33. ---------------------------------------------------------------------
  34. 你的要求非法,我们不能提供
  35. ======我是有底线的======
  36. 我是刀类生产线,正在生产刀具
  37. 我是矛类生产线,正在生产矛具

当皇三把第三个口令改成“HDMZ--皇大混账”时,想购买的枪类武器就被拒绝。由于皇大早期建的武器工厂的只是“简单的工厂模式”,并没有考虑到后期武器的发展,缺乏战略目光,更多高科技武器快速发展,但是皇大却只能在主工厂生产,没有分厂建设能力。这相当不利于新的高科技武器开发,目前所有新增加的武器都得对简单工厂(SimpleFactory())进行改造,并要求客户提供正常的口令才能实现生产,极其不方便。

为了解决这个行来痛点,皇大组织了N次头脑风暴,并放下狠话来,要是没有想到新的方法,谁也不许回家睡觉。大家真的是急得像热锅上的蚂蚁,这时皇大手下的一位掌故就想出来一个法子。他建议把生产权力下放,让分厂拥有接单能力,总厂只负责生产工艺。武器的生产则由生产部指导,生产订单则由分厂接,并向总厂申请生产工艺与技术。这样每当有新的高科技武器需求,就开辟一条新的生产线,同时为这条新生产线建造一个生产车间。总厂负责调度工艺文件,生产部门负责下达生产任务。此问题不就解决了。只要有新的武器需求,我们就开辟新生产车间,同时下达新的生产任务,这样就不用每次需求变更就都要整改总厂了。我们也不需要口令了,而且无论是什么样的需求,只要是生产让每个武器的掌柜去接单就可以生产了。

  1. import abc
  2. class Product(metaclass=abc.ABCMeta):#拿到生产武器的生产资质及技术
  3. @abstractmethod
  4. def fabricate(): #定义能够生产武器的方法
  5. pass
  6. #引进刀类,矛类,枪类的生产线
  7. class ProductBittool(Product):#刀类生产线
  8. def fabricate(self):#生产工艺
  9. print("我是刀类生产线,正在生产刀具")
  10. class ProductSpear(Product):#mao矛类生产线
  11. def fabricate(self):#生产工艺
  12. print("我是矛类生产线,正在生产矛具")
  13. class ProductGun(Product):#刀类生产线
  14. def fabricate(self):#生产工艺
  15. print("我是枪类生产线,正在生产枪具")
  16. #开武器店接单,不然那些工人不造反才怪,现在的已经下滑,日子真提无法过了,快点来点单子吧。工厂接单子
  17. class Creator(metaclass=abc.ABCMeta):#工厂接订单
  18. @abstractmethod
  19. def factory_method(self):#接单根据定制要求,给定订分配生产线,比如要求生产刀类,则传入刀类生产线ProductBittool()
  20. pass
  21. def some_operation(self):#产生要求生产的需求
  22. product = self.factory_method()
  23. product.fabricate()#具体生产过程
  24. class CreatorBittool(Creator):#刀类掌柜
  25. def factory_method(self):#接单
  26. return ProductBittool()#下单生产刀类
  27. class CreatorSpear(Creator):#矛类掌柜
  28. def factory_method(self):#接单
  29. return ProductSpear()#下单生产矛具
  30. class CreatorGun(Creator):#刀类掌柜
  31. def factory_method(self):#接单
  32. return ProductGun()#下单生产枪具
  33. #开始疑惑,掌柜接单后只需要告诉生产就好了,为何还要经过工厂呢,因为掌柜没有生产工艺,只有工厂有。
  34. bittool = CreatorBittool()
  35. bittool.some_operation()
  36. spear = CreatorSpear()
  37. spear.some_operation()
  38. gun = CreatorGun()
  39. gun.some_operation()
  40. -------------------------------------------------------
  41. 我是刀类生产线,正在生产刀具
  42. 我是矛类生产线,正在生产矛具
  43. 我是枪类生产线,正在生产枪具

皇三:听说皇大的武器工厂最能升级了功能,我来去试试看,“掌柜的,宝塔镇河妖,皇大威武”。

掌柜:“三皇子,现在我们系统已经升级了,已经不再需要口令了,你需要哪种武器,每种武器前面都有分掌柜,只需要跟他们提要求就好了。如果他们无法满足你,我们皇大也会专门您开辟新的武器研究的,谁叫我们都是为皇家而战呢。”从此以后,皇三再也不用直接去记住口令了。只需要找分掌故提要求就好了。皇三再逛店的时候就变成了这样了。终于可以友好只要动动嘴就行了,

以上是对工厂模式的浅浅理解。

总结一下,就是生产跟需求解偶,为什么要有Product()这个抽像类,理解是抽像共同的东西,你是个生产武器的的产品,虽然有不同的生产品要求,都要有共同的标准,粗理解就是行业要求,总不能你是武器工厂,然后来来生产内衣吧,就算开辟一条特例生产线,也不像话。有了Product()这个类,那么你要生产的产品就都会是一样的,生产武器就是武器,内衣就是内衣。ProductBittool(Product)这些子类就是基于Product这个类的要求来生产产品,这样你要生产什么武器就创建这个什么样的生产线。这就是生产部门决定的。

那跟工厂有什么关系

Creator()这个抽像类,我理解是总公司定义了一个接单功能,然后又不能直接去接单。就像背后的大佬一样,让分公司(棋子,永远不知道棋手后面是什么)去接。CreatorBittool(Creator),这个就像棋子去执行接单子任务,然后记录你所要接武器属于哪一条生产线,然后接到单子了,就用使用总厂提供的方法上报给总厂生产部门,生产部门就调用指定的生产线生产任务。

这样做了,就跟总厂没有任何关系了,总厂只做指导意见与中转,这样就解偶了订单需求跟生产直接绑定了。订单不用关心生产要使用哪条生产线,只要把我的需求准确生产出来就好,我不管你是使用什么技术生产的,也不用关心生产线在哪个地方。彻底的当起了甩手掌柜了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/450845
推荐阅读
相关标签
  

闽ICP备14008679号