浅析Python 抽象工厂模式的优缺点

所属分类: 脚本专栏 / python 阅读数: 284
收藏 0 赞 0 分享

前言

接着上一篇的故事工厂模式继续,手机要出厂,显然光一个手机肯定是不行的,还需要包装盒、充电器等等东西。我们按照上一篇提到的工厂模式,去建立新的工厂是一点都没有问题的。但是思考一下这样子做会带来的问题,显然工厂太多了,将包装盒、充电器全部分散到各个工厂,组装什么的也是一个大问题,那么有没有更好的办法呢?答案是肯定的,抽象工厂模式。

抽象工厂意图

提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的累。

别名

Kit

案例

第三阶段

光生产手机远远不够,还需要生产其他配件,分散到新的工厂成本太高,也不利于维护,那就把一个类型的手机所需要的所有东西,都放到一个工厂完成,小米工厂生产小米手机以及小米手机配套的东西,苹果手机生产苹果手机以及苹果手机配套的东西,客户只需要关心要什么手机就行了。

第三阶段 UML 图

让我们借助 UML 图直观了解一下这个时候工厂的样子

第三阶段代码

通过代码去实现这个逻辑

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 抽象工厂模式的资料请关注脚本之家其它相关文章!

更多精彩内容其他人还在看

pandas的qcut()方法详解

这篇文章主要介绍了pandas的qcut()方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

从列表或字典创建Pandas的DataFrame对象的方法

这篇文章主要介绍了从列表或字典创建Pandas的DataFrame对象的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

pandas.DataFrame的pivot()和unstack()实现行转列

这篇文章主要介绍了pandas.DataFrame的pivot()和unstack()实现行转列,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

pandas中的series数据类型详解

这篇文章主要介绍了pandas中的series数据类型详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

pandas 时间格式转换的实现

这篇文章主要介绍了pandas 时间格式转换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

python中时间、日期、时间戳的转换的实现方法

这篇文章主要介绍了python中时间、日期、时间戳的转换的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

pandas进行时间数据的转换和计算时间差并提取年月日

这篇文章主要介绍了pandas进行时间数据的转换和计算时间差并提取年月日,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法

这篇文章主要介绍了详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

python和c语言的主要区别总结

在本篇文章里小编给各位整理了关于python和c语言的主要区别的相关知识帖内容,有需要的朋友们学习阅读下。
收藏 0 赞 0 分享

选择Python写网络爬虫的优势和理由

在本篇文章里小编给各位整理了一篇关于选择Python写网络爬虫的优势和理由以及相关代码实例,有兴趣的朋友们阅读下吧。
收藏 0 赞 0 分享
查看更多