浅析Python 抽象工厂模式的优缺点
时间:2022-07-27
本文章向大家介绍浅析Python 抽象工厂模式的优缺点,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
接着上一篇的故事工厂模式继续,手机要出厂,显然光一个手机肯定是不行的,还需要包装盒、充电器等等东西。我们按照上一篇提到的工厂模式,去建立新的工厂是一点都没有问题的。但是思考一下这样子做会带来的问题,显然工厂太多了,将包装盒、充电器全部分散到各个工厂,组装什么的也是一个大问题,那么有没有更好的办法呢?答案是肯定的,抽象工厂模式。
抽象工厂意图
提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的累。
别名
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
总结
如果代码需要与多个不同系列的相关产品交互, 但是由于无法提前获取相关信息, 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建, 在这种情况下, 你可以使用抽象工厂。 在设计良好的程序中, 每个类仅负责一件事。 如果一个类与多种类型产品交互, 就可以考虑将工厂方法抽取到独立的工厂类或具备完整功能的抽象工厂类中。
抽象工厂的优缺点
优点
- 你可以确保同一工厂生成的产品相互匹配。
- 你可以避免客户端和具体产品代码的耦合。
- 单一职责原则。 你可以将产品生成代码抽取到同一位置, 使得代码易于维护。
- 开闭原则。 向应用程序中引入新产品变体时, 你无需修改客户端代码
缺点
- 由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂,即产品族扩展非常困难
- 剑指OFFER之栈的压入、弹出序列(九度OJ1366)
- Python标准库03 路径与文件 (os.path包, glob包)
- AI人工智能时代已经到来 “北斗即时判”实现纯语音交互
- 剑指OFFER之链表中倒数第k个节点(九度OJ1517)
- 用Qt写软件系列四:定制个性化系统托盘菜单
- Linux简介与厂商版本
- 用Qt写软件系列三:一个简单的系统工具之界面美化
- VS编译链接时错误(Error Link2005)的解决方法
- HttpClient使用心得
- 剑指OFFER之重建二叉树(九度OJ1385)
- 记录visual Studio使用过程中的两个问题
- 剑指OFFER之二维数组中的查找(九度OJ1384)
- Python标准库02 时间与日期 (time, datetime包)
- PR&AE插件开发遇到的一个坑
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法