浅析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编程实现二叉树及七种遍历方法详解
Jun 02 Python
对python 各种删除文件失败的处理方式分享
Apr 24 Python
Pandas中DataFrame的分组/分割/合并的实现
Jul 16 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
Python基于WordCloud制作词云图
Nov 29 Python
利用matplotlib实现根据实时数据动态更新图形
Dec 13 Python
python飞机大战pygame碰撞检测实现方法分析
Dec 17 Python
Python 实现敏感目录扫描的示例代码
May 21 Python
Python TestSuite生成测试报告过程解析
Jul 23 Python
python爬虫爬取网页数据并解析数据
Sep 18 Python
Python解析微信dat文件的方法
Nov 30 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
IIS6.0中配置php服务全过程解析
2013/08/07 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
PHP获取访问设备信息的方法示例
2019/02/20 PHP
document.all与WEB标准
2020/05/13 Javascript
javascript 中String.match()与RegExp.exec()的区别说明
2013/01/10 Javascript
js定时器(执行一次、重复执行)
2014/03/07 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
jquery获取url参数及url加参数的方法
2015/10/26 Javascript
一篇文章掌握RequireJS常用知识
2016/01/26 Javascript
JavaScript开发者必备的10个Sublime Text插件
2016/02/27 Javascript
Centos7 中安装 Node.js v4.4.4
2016/11/03 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
vue随机验证码组件的封装实现
2020/02/19 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
python MySQLdb使用教程详解
2018/03/20 Python
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
Weblogic和WebSphere不同特点
2012/05/09 面试题
室内设计专业学生的自我评价分享
2013/11/27 职场文书
高三地理教学反思
2014/01/11 职场文书
迎接领导欢迎词
2014/01/11 职场文书
民族团结先进集体事迹材料
2014/05/22 职场文书
党的群众路线教育实践活动批评与自我批评范文
2014/10/16 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书