浅析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 httplib,smtplib使用方法
Sep 06 Python
详解Python3操作Mongodb简明易懂教程
May 25 Python
python中子类调用父类函数的方法示例
Aug 18 Python
Python实现求笛卡尔乘积的方法
Sep 16 Python
Python中将变量按行写入txt文本中的方法
Apr 03 Python
Django开发中的日志输出的方法
Jul 02 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
Feb 13 Python
Pandas时间序列:时期(period)及其算术运算详解
Feb 25 Python
Python使用20行代码实现微信聊天机器人
Jun 05 Python
改变 Python 中线程执行顺序的方法
Sep 24 Python
Python实现简繁体转换
Jun 07 Python
Python编程中内置的NotImplemented类型的用法
Mar 23 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数据类型判断函数有哪些
2013/09/23 PHP
php strnatcmp()函数的用法总结
2013/11/27 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
2019/03/11 PHP
Javascript实例教程(19) 使用HoTMetal(5)
2006/12/23 Javascript
淘宝搜索框效果实现分析
2011/03/05 Javascript
学习JavaScript设计模式(继承)
2015/11/26 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
简单实现js选项卡切换效果
2017/02/09 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
Vue常用指令详解分析
2018/08/19 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
JS实现烟花爆炸效果
2020/03/10 Javascript
javascript实现多边形碰撞检测
2020/10/24 Javascript
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
bat和python批量重命名文件的实现代码
2016/05/19 Python
浅谈python 四种数值类型(int,long,float,complex)
2016/06/08 Python
tensorflow训练中出现nan问题的解决
2018/02/10 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
Pytorch中.new()的作用详解
2020/02/18 Python
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
世界上最大的隐形眼镜商店:1-800 Contacts
2018/11/03 全球购物
捐书寄语赠言
2014/01/18 职场文书
六查六看剖析材料
2014/02/15 职场文书
国培远程培训感言
2014/03/08 职场文书
文明村镇申报材料
2014/05/06 职场文书
争先创优公开承诺书
2014/08/30 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
法院答辩状格式
2015/05/22 职场文书
导游词之桂林
2019/08/20 职场文书
Nginx 负载均衡是什么以及该如何配置
2021/03/31 Servers