浅析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 del()函数用法
Mar 24 Python
python通过smpt发送邮件的方法
Apr 30 Python
Python实现的选择排序算法原理与用法实例分析
Nov 22 Python
python+matplotlib绘制3D条形图实例代码
Jan 17 Python
Python获取系统所有进程PID及进程名称的方法示例
May 24 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
Aug 30 Python
python3.6实现学生信息管理系统
Feb 21 Python
python tkinter窗口最大化的实现
Jul 15 Python
对django2.0 关联表的必填on_delete参数的含义解析
Aug 09 Python
Python docutils文档编译过程方法解析
Jun 23 Python
python更新数据库中某个字段的数据(方法详解)
Nov 18 Python
PyTorch中permute的使用方法
Apr 26 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
模拟OICQ的实现思路和核心程序(二)
2006/10/09 PHP
PHP截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
PHP mysql事务问题实例分析
2016/01/18 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
jquery-easyui关闭tab自动切换到前一个tab
2010/07/29 Javascript
JavaScript.The.Good.Parts阅读笔记(二)作用域&闭包&减缓全局空间污染
2010/11/16 Javascript
ajax中get和post的说明及使用与区别
2012/12/23 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
方便实用的jQuery checkbox复选框全选功能简单实例
2013/10/09 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
2016/06/24 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
JS实现页面数据懒加载
2020/02/13 Javascript
Python实现分割文件及合并文件的方法
2015/07/10 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
python实现K最近邻算法
2018/01/29 Python
使用python脚本实现查询火车票工具
2018/07/19 Python
Python3多目标赋值及共享引用注意事项
2019/05/27 Python
python tkinter控件布局项目实例
2019/11/04 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
德国网上宠物店:Zoobio
2018/05/23 全球购物
下面关于"联合"的题目的输出是什么
2013/08/06 面试题
Delphi软件工程师试题
2013/01/29 面试题
保安的辞职报告怎么写
2014/01/20 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
合伙开公司协议书范本
2014/10/28 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书