浅析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逐行读取文件内容的三种方法
Jan 20 Python
python开启多个子进程并行运行的方法
Apr 18 Python
深入解析Python中函数的参数与作用域
Mar 20 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
May 31 Python
对pycharm 修改程序运行所需内存详解
Dec 03 Python
详解Python装饰器
Mar 25 Python
python GUI实现小球满屏乱跑效果
May 09 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
Jun 14 Python
python+opencv实现摄像头调用的方法
Jun 22 Python
python 列表、字典和集合的添加和删除操作
Dec 16 Python
keras的siamese(孪生网络)实现案例
Jun 12 Python
如何创建一个Flask项目并进行简单配置
Nov 18 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(1) php开发环境配置
2010/02/15 PHP
PHP可变变量学习小结
2015/11/29 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
php 判断IP为有效IP地址的方法
2018/01/28 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
jQuery表单验证插件解析(推荐)
2016/07/21 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
Vue 实时监听窗口变化 windowresize的两种方法
2018/11/06 Javascript
详解Vscode中使用Eslint终极配置大全
2019/11/08 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
Python信息抽取之乱码解决办法
2017/06/29 Python
python中os和sys模块的区别与常用方法总结
2017/11/14 Python
python绘制散点图并标记序号的方法
2018/12/11 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
2020/07/01 Python
无畏的旅行:Intrepid Travel
2017/12/20 全球购物
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
NYX Professional Makeup英国官网:美国平价专业彩妆品牌
2019/11/13 全球购物
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
学校后勤岗位职责
2014/02/19 职场文书
房屋转让协议书范本
2014/04/11 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
道德模范事迹材料
2014/12/20 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
《灰雀》教学反思
2016/02/19 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis