浅析Python 抽象工厂模式的优缺点
作者:Leetao 发布时间:2021-08-12 01:33:17
前言
接着上一篇的故事工厂模式继续,手机要出厂,显然光一个手机肯定是不行的,还需要包装盒、充电器等等东西。我们按照上一篇提到的工厂模式,去建立新的工厂是一点都没有问题的。但是思考一下这样子做会带来的问题,显然工厂太多了,将包装盒、充电器全部分散到各个工厂,组装什么的也是一个大问题,那么有没有更好的办法呢?答案是肯定的,抽象工厂模式。
抽象工厂意图
提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的累。
别名
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
总结
如果代码需要与多个不同系列的相关产品交互, 但是由于无法提前获取相关信息, 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建, 在这种情况下, 你可以使用抽象工厂。
在设计良好的程序中, 每个类仅负责一件事。 如果一个类与多种类型产品交互, 就可以考虑将工厂方法抽取到独立的工厂类或具备完整功能的抽象工厂类中。
抽象工厂的优缺点
优点
你可以确保同一工厂生成的产品相互匹配。
你可以避免客户端和具体产品代码的耦合。
单一职责原则。 你可以将产品生成代码抽取到同一位置, 使得代码易于维护。
开闭原则。 向应用程序中引入新产品变体时, 你无需修改客户端代码
缺点
由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂,即产品族扩展非常困难
来源:https://www.cnblogs.com/leetao94/p/13291508.html


猜你喜欢
- 最近接了一个比较简单的图像处理的单子,花了一点时间随便
- 假设有一个可迭代对象,现在想要对它内部的元素进行排序,我们一般会使用内置函数 sorted,举个例子:data = (3
- set oSQLServer =server.createobject("SQLDMO.SQLServer")oSQLS
- 目录一、索引基本知识1.1 索引的优点1.2 索引的用处1.3 索引的分类1.4 面试技术名词1.5 索
- 本文实例讲述了js实现简单的可切换选项卡效果的方法。分享给大家供大家参考。具体如下:如图,最简单的纯粹的选项卡第一步,当然是先写html代码
- MySQL的自增id都定义了初始值,然后不断加步长。虽然自然数没有上限,但定义了表示这个数的字节长度,计算机存储就有上限。比如,无符号整型(
- 本文实例讲述了php的RSA加密解密算法原理与用法。分享给大家供大家参考,具体如下:最近因为工作的需要,要倒腾支付宝支付相关的知识,因为支付
- 最近准备使用Python+Hadoop+Pandas进行一些深度的分析与机器学习相关工作。(当然随着学习过程的进展,现在准备使用Python
- 遇到这样的错误如:“Last_IO_Error: Got fatal error 1236 from master when reading
- 本文实例为大家分享了tkinter+pygame+spider实现音乐播放器,供大家参考,具体内容如下1.确定页面SongSheet&nbs
- join toString该两种方法会将数组元素的类型转换为字符串var arr = [1, [2, [3, [4, 5]]], 6];co
- 本文实例讲述了JS实现获取数组中最大值或最小值功能。分享给大家供大家参考,具体如下:方法一://最小值Array.prototype.min
- 栗子:计算斐波那契数列(任一个数都是前两个数之和的数字序列)Python2.7实现代码如下:<strong><span s
- 出现问题: 1. 使用层制作的下拉菜单下正好有FLASH动画,菜单被动画遮挡. 2. 页面中的层浮动广告当经过FLASH动画时,浮动层从动画
- 误区 #30:有关备份的30个误区全是错的在开始有关备份的误区之前,如果你对备份的基础没有了解,请看之前我在TechNet Magazine
- php判断正常访问和外部访问 <?php session_start(); if(isset($_POST['check
- 分别创建增加、删除、更新的触发器(Trigger)来达到两张表之间数据同步的目的。 1:数据同步增加: 如有两张表——A表和B表,创建触发器
- matplotlib官网 matplotlib库默认英文字体添加黑体(‘SimHei')为绘图字体代码:plt.rcPar
- 一 创建mappingPUT test{ "mappings": { "
- 本文是关于人物角色的一些简单介绍,感谢瑶芝同学提供的大力帮助! 人物角色(Personas)作为一种技术