Python设计模式 - 抽象工厂模式

news2024/9/24 11:28:51

定义

抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

产品等级结构与产品族

为了更好地理解抽象工厂模式,先引入两个概念:

  1. 产品等级结构:就是产品的继承结构。例如电视机抽象类有A品牌电视机子类和B品牌电视机子类,那么抽象电视机和具体品牌的电视机就构成了一个产品等级结构。
  2. 产品族:同一个工厂生产的,位于不同产品等级结构中的一组产品。例如海尔工厂生产的海尔电视机、海尔电冰箱就构成了一个产品族。

结构

在这里插入图片描述

  • 抽象工厂(Abstract Factory):声明一组用于创建一个产品族产品的工厂方法,每个工厂方法对应一种产品。
  • 具体工厂(Concrete Factory):实现抽象工厂中的工厂方法,这些方法创建的产品构成了一个产品族,每种产品都位于不同的产品等级结构中。
  • 抽象产品(Abstract Product):定义产品对象的接口。
  • 具体产品(Concrete Product):实现产品接口的具体产品对象。

应用场景

  1. 跨平台的产品系列:当需要为不同的平台(如Windows、Mac、Linux)创建一系列相关的产品时,可以使用抽象工厂模式。每个具体工厂类实现工厂方法来创建一个平台的所有产品。例如,跨平台的GUI框架需要针对不同操作系统生成不同风格的按钮、文本框等组件。
  2. 使用多个产品族:系统中有多于一个的产品族,而每次只使用其中某一个产品族,客户端可以通过配置文件等方式来使得用户可以动态改变产品族,也可以很方便地增加新的产品族。例如,窗口中的按钮、文本框可以根据用户的选择按照不同的风格来展示。

优缺点

优点:

  1. 封装对象创建:抽象工厂模式将一系列相关对象的创建封装在一起,客户端无需关心对象的创建过程和具体类型。这减少了代码的耦合度,使系统更易于维护和扩展。
  2. 产品族的一致性:使用一个具体工厂创建的产品对象可以确保属于同一个产品族,且它们之间是兼容的。这避免了客户端在组合不同产品时可能出现的不兼容问题。
  3. 易于扩展:当需要引入新的产品族时,只需添加新的具体工厂类和对应的具体产品类,而不需要修改现有代码。这样能够确保系统的开放-封闭原则,即对扩展开放,对修改封闭。

缺点:

  1. 难以支持新产品类型:如果要添加新的产品等级结构,需要修改抽象工厂类及所有的具体工厂类,这违反了开放-封闭原则,增加维护成本。因此在使用抽象方法模式之前要进行全面考虑,尽量不要在设计完成后增加或删除产品等级结构。

代码示例

from abc import ABC, abstractmethod


# 抽象产品 - 按钮
class Button(ABC):
    @abstractmethod
    def click(self):
        pass


# 抽象产品 - 文本框
class TextBox(ABC):
    @abstractmethod
    def input(self, text):
        pass


# 具体产品 - Windows 按钮
class WindowsButton(Button):
    def click(self):
        print("Windows Button Clicked")


# 具体产品 - Windows 文本框
class WindowsTextBox(TextBox):
    def input(self, text):
        print(f"Windows TextBox input: {text}")


# 具体产品 - Mac 按钮
class MacButton(Button):
    def click(self):
        print("Mac Button Clicked")


# 具体产品 - Mac 文本框
class MacTextBox(TextBox):
    def input(self, text):
        print(f"Mac TextBox input: {text}")


# 抽象工厂
class GUIFactory(ABC):
    @abstractmethod
    def create_button(self):
        pass

    @abstractmethod
    def create_textbox(self):
        pass


# 具体工厂 - Windows 工厂
class WindowsFactory(GUIFactory):
    def create_button(self):
        return WindowsButton()

    def create_textbox(self):
        return WindowsTextBox()


# 具体工厂 - Mac 工厂
class MacFactory(GUIFactory):
    def create_button(self):
        return MacButton()

    def create_textbox(self):
        return MacTextBox()


# 客户端代码
def client(factory: GUIFactory):
    button = factory.create_button()
    textbox = factory.create_textbox()
    button.click()
    textbox.input("Hello World")


# 使用 Windows 工厂
print("Using Windows Factory:")
client(WindowsFactory())

# 使用 Mac 工厂
print("\nUsing Mac Factory:")
client(MacFactory())

抽象工厂模式和工厂方法模式的比较

抽象工厂模式是工厂方法模式的进一步延伸,我们从以下几点进行比较它们:

  1. 系统开销:工厂方法模式中的每个工厂只生产一种产品,可能会导致系统中存在大量的工厂类,会增加系统的开销。而抽象工厂模式将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,极大地减少了工厂类的数量。
  2. 扩展性:工厂方法模式增加新产品比较容易,只需要增加对应产品类和工厂方法类即可。抽象工厂模式增加新的产品族比较容易,但增加新的产品类型,需要修改抽象工厂类及所有的具体工厂类,扩展性稍差。
  3. 适用场景:工厂方法模式适用于系统只需要一个产品的多种变体的场景,抽象方法模式适用于系统需要创建多个相关产品族的场景。

参考

《设计模式的艺术》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1976245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

u盘数据丢失怎么办?以下这四招教你轻松找回!

重要的文件资料要是不小心手滑删除了,轻则遭受领导的责骂,重则就是直接受到老板的警告了,所以打工人应该要人手必备数据找回的技巧,尤其是在针对已经拷贝好了数据在u盘当中时,更是需要快速去找到数据恢复的技巧&#x…

S02. 内核的实现(未完)

一、虚拟内存管理 1、内存分页 二级页表线性地址转换物理地址过程如下: 用虚拟地址的高10位乘以4,作为页目录表内的偏移地址,加上页目录表的物理地址,所得的和便是页目录项的物理地址。读取该页目录项,从中获取到页…

隐藏采购订单类型

文章目录 1 Introduction2 code 1 Introduction The passage is that how to hiden purchase type . 2 code DATA: ls_shlp_selopt TYPE ddshselopt. IF ( sy-tcode ME21N OR sy-tcode ME22N OR sy-tcode ME23N or sy-tcode ME51N OR sy-tcode ME52N OR sy-tcode ME5…

CTFSHOW 萌新 web10 解题思路和方法(passthru执行命令)

点击题目链接,分析页面代码。发现代码中过滤了system、exec 函数,这意味着我们不能通过system(cmd命令)、exec(cmd命令)的方式运行命令。 在命令执行中,常用的命令执行函数有: system(cmd_code);exec(cmd_…

Xilinx管脚验证流程及常见问题

1 流程 1.1 新建I/O Planning Project I/O Planning Project中可以不需要RTL的top层.v代码,仅图形化界面即可配置管脚约束XDC文件的生成: Create I/O Ports: 导出XDC文件和自动生成的top_interface.v文件: 1.2 新建test Project …

HarmonyOS开发:生命周期详解

目录 前言 生命周期的概念HarmonyOS生命周期最后 前言 随着移动端操作系统的多样化发展,HarmonyOS作为华为推出的一款面向全场景的分布式操作系统,受到了业内外的广泛关注。其实HarmonyOS的设计和开发模式,与传统的移动端操作系统有着显著…

【TwinCAT3教程】IEC61131-3编程基础

在开发可编程序控制器(PLC)的早期阶段没有统一的标准,这种编程语言不统一的情况,给用户带来极大的不方便,近几年由于自动化系统的发展,IEC的第七个工作组制定了IEC(International Electro techn…

三十七、MyBatis-Plus(3)

🌻🌻 目录 一、CRUD 扩展 (2)1.1 Select1.2 分页查询1.3 Delete1.3.1 物理删除1.3.2 逻辑删除 二、性能分析插件三、条件构造器四、代码自动生成器 一、CRUD 扩展 (2) 1.1 Select 查询所有: /* * 查询 * */Test //查询全部 public void sele…

PCB设计经验——布线原则

1.连线精简——避免直角布线 导线也应看作一种元器件,有自己的电阻,电感,电容 PCB走线在直角转弯的地方,信号前后部分相互影响,导致分布电容增加,对信号上升沿和下降沿有延缓影响。从阻抗的角度来说&#…

鸿蒙媒体开发【相机数据采集保存】拍照和图片

相机数据采集保存 介绍 本示例主要展示了相机的相关功能 接口实现相机的预览拍照功能。 效果预览 使用说明 弹出是否允许“CameraSample”使用相机?点击“允许”弹出是否允许“CameraSample”使用麦克风?点击“允许”进入预览界面,预览正…

快递点“内鬼”才是倒卖我们个人信息的源头

下面是一个真实的案例来分析一下我们的信息是怎么被倒卖出去的。以次来给大家敲响警钟,不要相信所谓的退货退款类的诈骗。【所有涉及到金钱的都是诈骗,获取你信息也很容易,所以不要轻信诈骗谎言】 01-盗取快递信息过程 内鬼与骗子勾结&…

深度学习(1)--机器学习、人工智能、深度学习的关系

1956 年提出 AI 概念,短短3年后(1959) Arthur Samuel 就提出了机器学习的概念: Field of study that gives computers the ability to learn without being explicitly programmed. 机器学习研究和构建的是一种特殊算法&#xff0…

Mindspore框架DCGAN模型实现漫画头像生成|(二)DCGAN模型构建

Mindspore框架DCGAN模型实现漫画头像生成 Mindspore框架DCGAN模型实现漫画头像生成|(一)漫画头像数据集准备Mindspore框架DCGAN模型实现漫画头像生成|(二)DCGAN模型构建Mindspore框架DCGAN模型实现漫画头像生成|(三&a…

广州市广州城市信息模型(CIM)白皮书学习

一级标题 二级标题 框架 四级标题 五级标题 六级标题 CIM平台定义 以建筑信息模型(BIM)、地理信息系统(GIS)、物联网(IoT)等技术为基础,整合城市地上地下、室内室外、历史现状未来多维多尺度信息模型数据和城市感知数据,构建起三维数字空间的城市…

主持人大赛活动流程和规则

比赛内容: ①命题主持三分钟 选手抽签获得一命题主持内容,思考三十秒后开始主持 ②模拟主持两分钟 选手提前自己准备好,模拟主持一段电视或广播节目。 要求创意新颖、声情并茂。 ③即兴演讲两分钟 选手现场抽题。抽到一个话题,思…

算法021:山脉数组的峰顶索引

山脉数组的峰顶索引. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/peak-index-in-a-mountain-array/ 这个题,看似好像不是递增或者递减数组&#xff…

【网络安全入门】学习网络安全必须知道的77个网络基础知识

1、TCP/IP 协议的四层模型(网络接口层、网络层、传输层、应用层) TCP/IP 协议是互联网通信的基础,四层模型中,网络接口层负责与物理网络的连接;网络层主要处理 IP 数据包的路由和转发;传输层提供端到端的可…

电路原理分析

文章目录 0 基础符号说明电容电感电阻U/IC二极管三极管变压器杂合元件IGBT电机运放开关TPJ高组态电阻上拉电阻可靠高电平提高驱动能力阻值选择下拉电阻可靠低电平晶振压电效应晶振原理实物电荷泵电路防倒灌电路0 基础符号说明 电容 电容 C Electrolytic capacitor 电解电容 E…

内网穿透--LCX端口转发实验

实验背景 通过公司带有防火墙功能的路由器接入互联网,然后由于私网IP的缘故,公网无法直接访问内部主机,通过端口转发,穿透访问内网主机服务。 实验设备 1.路由器一台,实现内部 DHCP 分配和边界 NAT 2.外网 window20…

Java语言程序设计——篇十一(3)

🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…