设计模式-抽象工厂模式(Abstract Factory Pattern)结构|原理|优缺点|场景|示例

目录

        设计模式(分类)        设计模式(六大原则)   

    创建型

        工厂方法         抽象工厂模式        

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这种模式的核心目的是将一组相关产品的创建过程封装起来,使得客户端可以使用一个统一的接口来创建这些产品家族中的任何产品,而无需关心具体的实现细节。抽象工厂模式特别适用于处理具有产品族的产品结构,其中产品族是指位于不同等级结构中的一组产品,它们之间可能存在一定的依赖或约束关系。

模式结构

抽象工厂模式通常包含以下角色:

  1. 抽象工厂(Abstract Factory):定义了一个创建产品族的接口,声明了一系列创建不同产品的方法。这些方法返回的是相应产品接口的引用。

  2. 具体工厂(Concrete Factory):实现了抽象工厂接口,负责生成一个或多个具体产品族中的产品对象。

  3. 抽象产品(Abstract Product):定义了产品族中每种产品的公共接口,它是所有具体产品类的基类或接口。

  4. 具体产品(Concrete Product):实现了抽象产品接口,是产品族中每种产品的具体实现。

工作原理

  • 客户端:通过调用具体工厂的接口来创建所需的产品对象,无需直接实例化具体产品类。
  • 具体工厂:实现了抽象工厂接口中定义的创建产品的方法,根据工厂的类型返回相应具体产品族中的产品对象。
  • 抽象产品:为产品对象定义了通用的接口,使得客户端可以使用抽象产品类型的引用来处理各种具体产品对象,无需关心具体产品类型。
  • 具体产品:实现了抽象产品的接口,提供了具体产品的功能实现。

优缺点

优点
  • 封装性:将一组相关产品的创建过程封装在一起,客户端无需了解具体产品的创建细节。
  • 一致性:提供一个统一的接口来创建相关或依赖的对象,保持产品族内部的一致性。
  • 灵活性与扩展性:当需要增加新的产品族时,只需增加一个新的具体工厂和相关产品类即可,不影响已有代码,符合“开闭原则”。
  • 隔离变化:通过抽象工厂隔离了高层模块与具体产品的依赖关系,使得高层模块无需关心产品族内部的变化。
缺点
  • 增加复杂性:对于简单系统,引入抽象工厂可能会增加不必要的复杂性。
  • 产品族扩展困难:如果产品族中添加新产品,不仅需要修改抽象工厂和具体工厂,还可能影响到使用抽象工厂的客户端代码。
  • 类的层级结构复杂:随着产品种类的增加,可能会导致类的层级结构变得复杂。

适用场景

  • 产品族内有多组相关产品:当一个系统需要创建一系列相关或依赖的产品对象时,且这些产品之间存在一定的约束或兼容性要求,抽象工厂模式非常适合。
  • 需要隔离高层模块与具体产品的依赖:如果希望高层模块不直接依赖具体产品的创建过程,可以通过抽象工厂来封装创建细节。
  • 系统需要支持多种产品系列:如果有多种产品系列(如不同操作系统上的图形界面组件),且希望在不修改客户端代码的情况下引入新的产品系列,可以使用抽象工厂模式。

代码示例(以Java为例)

// 抽象产品(操作系统相关的UI组件接口)
interface Button {void display();
}interface TextField {void display();
}// 具体产品(Windows平台的UI组件)
class WindowsButton implements Button {@Overridepublic void display() {System.out.println("Displaying Windows button");}
}class WindowsTextField implements TextField {@Overridepublic void display() {System.out.println("Displaying Windows text field");}
}// 具体产品(MacOS平台的UI组件)
class MacOSButton implements Button {@Overridepublic void display() {System.out.println("Displaying MacOS button");}
}class MacOSTextField implements TextField {@Overridepublic void display() {System.out.println("Displaying MacOS text field");}
}// 抽象工厂
interface UIFactory {Button createButton();TextField createTextField();
}// 具体工厂(Windows平台UI工厂)
class WindowsUIFactory implements UIFactory {@Overridepublic Button createButton() {return new WindowsButton();}@Overridepublic TextField createTextField() {return new WindowsTextField();}
}// 具体工厂(MacOS平台UI工厂)
class MacOSUIFactory implements UIFactory {@Overridepublic Button createButton() {return new MacOSButton();}@Overridepublic TextField createTextField() {return new MacOSTextField();}
}// 客户端代码
public class Main {public static void main(String[] args) {UIFactory windowsFactory = new WindowsUIFactory();UIFactory macosFactory = new MacOSUIFactory();Button windowsButton = windowsFactory.createButton();TextField windowsTextField = windowsFactory.createTextField();windowsButton.display();windowsTextField.display();Button macosButton = macosFactory.createButton();TextField macosTextField = macosFactory.createTextField();macosButton.display();macosTextField.display();}
}

 在这个Java示例中:

  • ButtonTextField接口作为抽象产品,定义了UI组件的基本行为。
  • WindowsButtonWindowsTextFieldMacOSButtonMacOSTextField类是具体产品,它们分别实现了对应平台的UI组件功能。
  • UIFactory接口作为抽象工厂,定义了创建按钮和文本字段的方法。
  • WindowsUIFactoryMacOSUIFactory类是具体工厂,它们实现了UIFactory接口,分别创建对应平台的UI组件。
  • Main类的main方法中,客户端代码通过创建不同平台的工厂对象,然后调用工厂方法来创建所需UI组件,无需关心组件的具体实现细节。通过切换不同的工厂对象,可以轻松地在不同平台的UI风格之间切换。

这个Java示例展示了抽象工厂模式的应用,通过抽象工厂创建相关产品族中的对象,使得客户端代码与具体产品的实现细节解耦,增强了系统的灵活性和可扩展性。当需要支持新的操作系统平台时,只需添加新的具体工厂和UI组件类即可,无需修改已有的客户端代码。

代码示例(以Python为例)

# 抽象产品(操作系统相关的UI组件)
class Button:def display(self):raise NotImplementedError("Subclasses must implement this abstract method")class TextField:def display(self):raise NotImplementedError("Subclasses must implement this abstract method")# 具体产品(Windows平台的UI组件)
class WindowsButton(Button):def display(self):return "Displaying Windows button"class WindowsTextField(TextField):def display(self):return "Displaying Windows text field"# 具体产品(MacOS平台的UI组件)
class MacOSButton(Button):def display(self):return "Displaying MacOS button"class MacOSTextField(TextField):def display(self):return "Displaying MacOS text field"# 抽象工厂
class UIFactory:def create_button(self):raise NotImplementedError("Subclasses must implement this abstract method")def create_text_field(self):raise NotImplementedError("Subclasses must implement this abstract method")# 具体工厂(Windows平台UI工厂)
class WindowsUIFactory(UIFactory):def create_button(self):return WindowsButton()def create_text_field(self):return WindowsTextField()# 具体工厂(MacOS平台UI工厂)
class MacOSUIFactory(UIFactory):def create_button(self):return MacOSButton()def create_text_field(self):return MacOSTextField()# 客户端代码
def main():windows_factory = WindowsUIFactory()macos_factory = MacOSUIFactory()button = windows_factory.create_button()text_field = windows_factory.create_text_field()print(button.display())print(text_field.display())button = macos_factory.create_button()text_field = macos_factory.create_text_field()print(button.display())print(text_field.display())if __name__ == "__main__":main()

在这个Python示例中:

  • ButtonTextField类作为抽象产品,定义了UI组件的基本接口。
  • WindowsButtonWindowsTextFieldMacOSButtonMacOSTextField类是具体产品,它们分别实现了对应平台的UI组件功能。
  • UIFactory类作为抽象工厂,定义了创建按钮和文本字段的方法。
  • WindowsUIFactoryMacOSUIFactory类是具体工厂,它们实现了UIFactory接口,分别创建对应平台的UI组件。
  • 客户端代码中,通过创建不同平台的工厂对象,然后调用工厂方法来创建所需UI组件,无需关心组件的具体实现细节。通过切换不同的工厂对象,可以轻松地在不同平台的UI风格之间切换。

这个例子展示了抽象工厂模式在Python中的应用,通过抽象工厂创建相关产品族中的对象,使得客户端代码与具体产品的实现细节解耦,增强了系统的灵活性和可扩展性。当需要支持新的操作系统平台时,只需添加新的具体工厂和UI组件类即可,无需修改已有的客户端代码。 

 

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

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

相关文章

Python之Excel合并

大家好!今天我们要一起探索如何使用Python这个神奇的工具,将一堆Excel文件轻松合并成一个大文件。想象一下,就像是一台高效的Excel数据收割机,让你的工作效率飙升!准备好你的笔记本,跟着我一步步操作吧。 …

【倾诉】我与IT

是的! 今天不想发知识博客了,想谈谈这些年这几年的我和IT 懵懂 2018年,参加了高考,出成绩那天格外闷热。报考志愿的那天脑袋空空的我填了生物、化学、数学这一类志愿,然后勾选了 调剂√ 这样,一个脑袋空…

hexo实现个人博客及涉及的技术学习

一、背景 最近,一直想做一个属于自己的网站.可以从零开始搭建一个网站,顺便可以把日常中学到的技术用于实战,还可以顺便记录自己的所思所感,记录成长的过程. 方案 一开始的方案是从零开始,模仿常见个人博客的设计,基于vueSpringbootMySQL的去实现网站. 新建项目之后,发现vu…

归一化平面和像素坐标系

归一化平面: 归一化的平面(Normalized Plane)在计算机视觉和三维重建领域中指的是一个虚拟的二维平面,用于将三维空间中的点投影到相机的成像平面前的一个中间阶段。这个平面位于相机前方,并且它的坐标系经过特殊处理使…

AMEYA360:兆易创新推出GD32L235系列低功耗MCU新品

兆易创新GigaDevice (股票代码 603986)今日宣布,正式推出GD32L235系列MCU,进一步丰富了低功耗产品的选型和布局。全新GD32L235产品系列紧贴低功耗市场需求,以更优的功耗效率、丰富的接口资源、更高性价比为工业表计、智能门锁、便携式设备、I…

【Python】Python中大文件切割的艺术

淡淡相思 都写在脸上 沉沉离别背在肩上 泪水流过脸庞 所有的话 现在还是没有讲 看那青山 荡漾在水上 看那晚霞吻着夕阳 我用一生的爱 去寻找那一个家 今夜你在何方 转回头 迎着你的笑颜 心事全都被你发现 梦里遥远的幸福 它就在我的身旁 🎵 于…

线上线下交友社区系统 可打包小程序 支持二开 源码交付!

社交网络的普及,人们交友的方式发生了巨大的变化。过去,我们主要通过线下的方式来结识新朋友,比如在学校、工作场所、社交活动或者兴趣小组中。然而,随着移动端软件的发展,线上交友也逐渐变得流行。 方便性&#xff1a…

deepspeed笔记

文章目录 一、deepspeed是什么?二、能训多大的模型,耗时如何?三、RLHF训练流程四、通信策略 一、deepspeed是什么? 传统的深度学习,模型训练并行,是将模型参数复制多份到多张GPU上,只将数据拆分…

java可盈保险合同管理系统的设计与实现(springboot+mysql源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的可盈保险合同管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于Spring Boot的…

[蓝桥杯 | 暴搜] 学会暴搜之路

虽然会调侃蓝桥杯是暴力求解的,但是本弱弱不会搜,不知道如何搜,于是写下这篇碎碎念,记录看到过的,惊艳自己的暴搜。 小总结 题目特征:很复杂的排列组合 说是暴力,其实就是枚举罢了&#xff0…

CTF中常见的四种python逆向

说在前面: 什么是pyc文件? pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高, pyc 文件是 Python 编译过的字节码文…

华为OD机试 - 任务处理、可以处理的最大任务数(Java JS Python C C++)

须知 哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持 文章目录 须知题目描述输入描述输出描述解题思路:JS算法源码Java算法源码Python算法源码C算法源码题目描述 在某个项目中有多个任务(用task数组表示)需要你进行处理,其中: t…

大屏数字字体+渐变色

vue数据大屏使用数字字体_vue数字字体-CSDN博客 用css实现文字字体颜色渐变的三种方法_css 字体颜色渐变-CSDN博客

OpenHarmony多媒体-ijkplayer

简介 ijkplayer是OpenHarmony环境下可用的一款基于FFmpeg的视频播放器。 演示 编译运行 1、通过IDE工具下载依赖SDK,Tools->SDK Manager->OpenHarmony SDK 把native选项勾上下载,API版本>9 2、开发板选择RK3568,ROM下载地址. 选择…

美女视频素材无水印哪里找?四个顶级资源站点

寻找高质量的美女视频素材无水印对于制作引人注目的视频内容至关重要。如果你正困惑于“美女视频素材无水印哪里找”,以下是四个提供优秀无水印美女视频素材的网站,可以满足你的各种创作需求。 蛙学网:多样化的美女视频素材 首先推荐的是蛙…

关于pytouch的基本词汇

PyTorch是一个开源的机器学习框架,它提供了丰富的工具和库,用于构建和训练深度学习模型。PyTorch的基本定义如下: 张量(Tensor):PyTorch中的基本数据结构是张量,类似于多维数组。张量可以存储和…

LeetCode第797题: 所有可能的路径

目录 1.问题描述 2.问题分析 1.问题描述 给你一个有 n 个节点的有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)。 graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08…

[论文精读]Masked Autoencoders are scalable Vision Learners

摘要本文证明了掩码自编码器(MAE)是一种可扩展的计算机视觉自监督学习算法。我们的 MAE方法很简单:我们盖住输入图像的随机块并重建缺失的像素。它基于两个核心设计。首先,我们开发了一个非对称编码器-解码器架构,其中一个编码器仅对块的可见子集(没有掩…

现代人如何适应AIGC 时代

随着生成式 AI 技术的蓬勃发展,各行各业正逗‬到了‬不得不‬重新‬看待‬自己的时候‬。一方面,新技术的出现带来了无限商机,另一方面也催生出了诸多新的挑战。 据权威机构统计,到2030年,社会需要的人工智能人才会是…

Linux中如何安装ImageMagick及其常规使用命令

在Linux中安装ImageMagick可以通过包管理工具进行安装。具体步骤如下: 打开终端(Terminal)。 使用以下命令更新系统软件包列表: sudo apt update使用以下命令安装ImageMagick: sudo apt install imagemagick安装完…