浅析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 相关文章推荐
如何解决django配置settings时遇到Could not import settings 'conf.local'
Nov 18 Python
python清除字符串里非数字字符的方法
Jul 02 Python
python3抓取中文网页的方法
Jul 28 Python
python使用matplotlib绘制折线图教程
Feb 08 Python
Python在不同目录下导入模块的实现方法
Oct 27 Python
NumPy 数组使用大全
Apr 25 Python
Django框架视图函数设计示例
Jul 29 Python
python标记语句块使用方法总结
Aug 05 Python
python3.6生成器yield用法实例分析
Aug 23 Python
Python如何实现在字符串里嵌入双引号或者单引号
Mar 02 Python
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 Python
python数据分析之单因素分析线性拟合及地理编码
Jun 25 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
咖啡知识大全
2021/03/03 新手入门
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
用PHP解决的一个栈的面试题
2014/07/02 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
php获取当前月与上个月月初及月末时间戳的方法
2016/12/05 PHP
js获取图片长和宽度的代码
2009/11/24 Javascript
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
2012/10/12 Javascript
javaScript如何生成xmlhttp
2013/12/16 Javascript
jQuery插件Timelinr 实现时间轴特效
2015/10/04 Javascript
详解vue-Resource(与后端数据交互)
2017/01/16 Javascript
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
js 显示日期时间的实例(时间过一秒加1)
2017/10/25 Javascript
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
laydate时间日历插件使用方法详解
2018/11/14 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
js实现简单选项卡制作
2020/08/05 Javascript
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
python中单下划线(_)和双下划线(__)的特殊用法
2019/08/29 Python
使用pth文件添加Python环境变量方式
2020/05/26 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
美国著名首饰网站:BaubleBar
2016/08/29 全球购物
BRASTY捷克:购买香水、化妆品、手袋和手表
2017/07/12 全球购物
大唐电信科技股份有限公司java工程师面试经历
2016/12/09 面试题
超市促销实习自我鉴定
2013/09/23 职场文书
个人实用简单的自我评价
2013/10/19 职场文书
招聘单位介绍信
2014/01/14 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
办公用房租赁协议书
2014/11/29 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android