浅析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 相关文章推荐
Cython 三分钟入门教程
Sep 17 Python
Python实现从url中提取域名的几种方法
Sep 26 Python
Python的re模块正则表达式操作
May 25 Python
Python数据结构与算法之完全树与最小堆实例
Dec 13 Python
numpy找出array中的最大值,最小值实例
Apr 03 Python
Go/Python/Erlang编程语言对比分析及示例代码
Apr 23 Python
详解配置Django的Celery异步之路踩坑
Nov 25 Python
Python+OpenCV采集本地摄像头的视频
Apr 25 Python
Python如何通过Flask-Mail发送电子邮件
Jan 29 Python
终于搞懂了Keras中multiloss的对应关系介绍
Jun 22 Python
python元组拆包实现方法
Feb 28 Python
Python机器学习算法之决策树算法的实现与优缺点
May 13 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中的 == 运算符进行字符串比较
2006/11/26 PHP
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
2009/08/07 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
showModelessDialog()使用详解
2006/09/21 Javascript
JavaScript几种形式的树结构菜单
2010/05/10 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
6款新颖的jQuery和CSS3进度条插件推荐
2013/03/05 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
JavaScript中判断整字类型最简洁的实现方法
2014/11/08 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
JQuery日历插件My97DatePicker日期范围限制
2016/01/20 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
2016/06/20 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
ES6新特性之Symbol类型用法分析
2017/03/31 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
浅谈Vue.js路由管理器 Vue Router
2018/08/16 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
vue 解决computed修改data数据的问题
2019/11/06 Javascript
Python中的自定义函数学习笔记
2014/09/23 Python
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
详解python实现线程安全的单例模式
2018/03/05 Python
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
如何优雅地处理Django中的favicon.ico图标详解
2018/07/05 Python
python global和nonlocal用法解析
2020/02/03 Python
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
如何写好升职自荐信
2014/01/06 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
2014年少先队工作总结
2014/12/03 职场文书
单位实习鉴定评语
2015/01/04 职场文书
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python
Nginx 常用配置
2022/05/15 Servers