浅析Python 抽象工厂模式的优缺点


Posted in Python onJuly 13, 2020

前言

接着上一篇的故事工厂模式继续,手机要出厂,显然光一个手机肯定是不行的,还需要包装盒、充电器等等东西。我们按照上一篇提到的工厂模式,去建立新的工厂是一点都没有问题的。但是思考一下这样子做会带来的问题,显然工厂太多了,将包装盒、充电器全部分散到各个工厂,组装什么的也是一个大问题,那么有没有更好的办法呢?答案是肯定的,抽象工厂模式。

抽象工厂意图

提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的累。

别名

Kit

案例

第三阶段

光生产手机远远不够,还需要生产其他配件,分散到新的工厂成本太高,也不利于维护,那就把一个类型的手机所需要的所有东西,都放到一个工厂完成,小米工厂生产小米手机以及小米手机配套的东西,苹果手机生产苹果手机以及苹果手机配套的东西,客户只需要关心要什么手机就行了。

第三阶段 UML 图

让我们借助 UML 图直观了解一下这个时候工厂的样子

浅析Python 抽象工厂模式的优缺点

第三阶段代码

通过代码去实现这个逻辑

from abc import ABC, abstractmethod

# 抽象手机 
class AbstractMobile(ABC):
 
 @abstractmethod
 def make(self):
  pass

class XiaoMiMobile(AbstractMobile):
 
 def make(self):
  print("make xiaomi mobile")
  
class AppleMobile(AbstractMobile):
 
 def make(self):
  print("make apple mobile")

# 抽象手机配件
class AbstractOthers(ABC):
 
 @abstractmethod
 def make(self):
  pass

class XiaoMiOthers(AbstractMobile):
 
 def make(self):
  print("make xiaomi others")
  
class AppleOthers(AbstractMobile):
 
 def make(self):
  print("make apple others")

# 抽象工厂
class AbstractFactory(ABC):
 @abstractmethod
 def create_mobile(self) -> AbstractMobile:
  pass

 @abstractmethod
 def create_others(self) -> AbstractOthers:
  pass

class XiaoMiFactory(AbstractFactory):

 def create_mobile(self) -> XiaoMiMobile:
  return XiaoMiMobile().make()

 def create_others(self) -> XiaoMiOthers:
  return XiaoMiOthers().make()


class AppleFactory(AbstractFactory):

 def create_mobile(self) -> AppleMobile:
  return AppleMobile().make()

 def create_others(self) -> AppleOthers:
  return AppleOthers().make()

  
def client(factory: AbstractFactory) -> None:
 product_mobile = factory.create_mobile()
 product_others = factory.create_others()
 
if __name__ == "__main__":
 client(XiaoMiFactory())
 client(AppleFactory())

看一下运行结果:

make xiaomi mobile
make xiaomi others
make apple mobile
make apple others

总结

如果代码需要与多个不同系列的相关产品交互, 但是由于无法提前获取相关信息, 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建, 在这种情况下, 你可以使用抽象工厂。
在设计良好的程序中, 每个类仅负责一件事。 如果一个类与多种类型产品交互, 就可以考虑将工厂方法抽取到独立的工厂类或具备完整功能的抽象工厂类中。

抽象工厂的优缺点

优点

  • 你可以确保同一工厂生成的产品相互匹配。
  • 你可以避免客户端和具体产品代码的耦合。
  • 单一职责原则。 你可以将产品生成代码抽取到同一位置, 使得代码易于维护。
  • 开闭原则。 向应用程序中引入新产品变体时, 你无需修改客户端代码

缺点

  • 由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂,即产品族扩展非常困难

以上就是浅析Python 抽象工厂模式的优缺点的详细内容,更多关于Python 抽象工厂模式的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python通过pil将图片转换成黑白效果的方法
Mar 16 Python
python制作一个桌面便签软件
Aug 09 Python
Python卸载模块的方法汇总
Jun 07 Python
Python中防止sql注入的方法详解
Feb 25 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
Dec 14 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
Jan 24 Python
在NumPy中创建空数组/矩阵的方法
Jun 15 Python
Django中使用Celery的方法示例
Nov 29 Python
使用Django开发简单接口实现文章增删改查
May 09 Python
Tensorflow模型实现预测或识别单张图片
Jul 19 Python
pytorch 自定义数据集加载方法
Aug 18 Python
【超详细】八大排序算法的各项比较以及各自特点
Mar 31 Python
python正则表达式的懒惰匹配和贪婪匹配说明
Jul 13 #Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
Jul 13 #Python
对python中list的五种查找方法说明
Jul 13 #Python
使用Python项目生成所有依赖包的清单方式
Jul 13 #Python
Python判断远程服务器上Excel文件是否被人打开的方法
Jul 13 #Python
Python依赖包迁移到断网环境操作
Jul 13 #Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
Jul 13 #Python
You might like
php加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
JavaScript游戏之是男人就下100层代码打包
2010/11/08 Javascript
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
jquery查找tr td 示例模拟
2014/05/08 Javascript
常用的JS验证和函数汇总
2014/12/23 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
详解ES6 Symbol 的用途
2018/10/14 Javascript
javascript匿名函数中的'return function()'作用
2018/10/15 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
Nuxt使用Vuex的方法示例
2019/09/06 Javascript
Python的Django框架可适配的各种数据库介绍
2015/07/15 Python
Python中random模块生成随机数详解
2016/03/10 Python
谈谈如何手动释放Python的内存
2016/12/17 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
python爬虫面试宝典(常见问题)
2018/03/02 Python
对tf.reduce_sum tensorflow维度上的操作详解
2018/07/26 Python
python框架flask入门之路由及简单实现方法
2020/06/07 Python
日本动漫周边服饰销售网站:Atsuko
2019/12/16 全球购物
JRE、JDK、JVM之间的关系怎样
2012/05/16 面试题
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
文秘人员工作职责
2014/01/31 职场文书
党员批评与自我批评范文
2014/09/23 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书
高一军训决心书
2015/02/05 职场文书
门球健将观后感
2015/06/16 职场文书
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python
JS前端使用Canvas快速实现手势解锁特效
2022/09/23 Javascript