设计模式——抽象工厂模式

定义:

抽象工厂模式(Abstract Factory Pattern)提供一个创建一系列或相互依赖对象的接口,而无须指定它们具体的类。

概述:一个工厂可以提供创建多种相关产品的接口,而无需像工厂方法一样,为每一个产品都提供一个具体工厂

以下是抽象工厂模式的一些常见用途:

  1. 系统独立性:抽象工厂模式可以让客户端与具体类的创建逻辑分离,使得客户端代码不依赖于具体类,从而提高了系统的独立性。

  2. 产品族的创建:抽象工厂模式通常用于创建一系列相关或相互依赖的产品,这些产品被设计成一起使用,例如,在图形用户界面 (GUI) 应用程序中,可能需要一套相同风格的按钮、文本框和窗口。

  3. 跨平台兼容性:抽象工厂模式可以帮助在不同的平台上创建相同风格的产品,而无需修改客户端代码。例如,在开发跨平台的游戏时,可以使用抽象工厂模式创建适配于不同平台的相同类型的游戏对象。

抽象工厂模式核心角色:
 

  1. 抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂可以是接口或抽象类。
  2. 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。
  3. 抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。
  4. 具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。

抽象工厂模式通常涉及一族相关的产品,每个具体工厂类负责创建该族中的具体产品。客户端通过使用抽象工厂接口来创建产品对象,而不需要直接使用具体产品的实现类。

示例:

假设我们有两种类型的电脑:台式机和笔记本电脑,每种电脑都有不同的规格:高性能和普通型。我们将使用抽象工厂模式来创建这些电脑。

代码:


// 台式机接口
interface Desktop {void displayInfo();
}// 笔记本电脑接口
interface Laptop {void displayInfo();
}// 具体的工厂类
class ConcreteComputerFactory implements ComputerFactory {@Overridepublic Desktop createDesktop() {return new RegularDesktop();}@Overridepublic Laptop createLaptop() {return new HighPerformanceLaptop();}
}// 普通型台式机
class RegularDesktop implements Desktop {@Overridepublic void displayInfo() {System.out.println("这是一台普通的台式电脑。");}
}// 高性能笔记本电脑
class HighPerformanceLaptop implements Laptop {@Overridepublic void displayInfo() {System.out.println("这是一台高性能的笔记本电脑。");}
}// 电脑工厂接口
interface ComputerFactory {Desktop createDesktop(); // 创建台式机Laptop createLaptop();   // 创建笔记本电脑
}public class Main {public static void main(String[] args) {// 创建具体的工厂ComputerFactory factory = new ConcreteComputerFactory();// 创建台式机Desktop desktop = factory.createDesktop();desktop.displayInfo();// 创建笔记本电脑Laptop laptop = factory.createLaptop();laptop.displayInfo();}
}

运行截图:

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

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

相关文章

open3d 连接两个点云

连接两个点云 一、连接两个点云二、代码三、结果1.coloud1点云2.cloud2点云3.cloud1 和 colud2 合并4.生成连接字段(拼接颜色) 四、相关链接五、问题与解决方案1.问题2.解决方案 一、连接两个点云 看代码吧。。。 二、代码 import numpy as np import…

数据结构-二叉树深度详解(附带源码)

目录 一、基本概念: 二、实现二叉树的数据结构: 三、二叉树性质: 四、相关计算 五、搜索二叉树:任何一颗树的左子树都比它小,右子树都比它大 六、二叉树的存储结构 七、二叉树基本操作 八、源码(有需…

使用pytest和allure框架实现自动化测试报告优化

pytest: 需要安装pytest和pytest-html(生成html测试报告) pip install pytest 和 pip install pytest-html 命名规则 Pytest单元测试中的类名和方法名必须是以test开头,执行中只能找到test开头的类和方法,比unittest更加严谨 unittest&#x…

【centos】【vsftpd】FTP本地用户登录配置

目录 ftp与sftp安装vsftpd和ftp本地用户登录-不限制访问目录本地用户登录-限制访问目录有可能影响连接的问题pam认证selinux策略被动模式防火墙ipv4和ipv6 报错1、 530 Login incorrect2、500 OOPS: vsftpd: refusing to run with writable root inside chroot()3、227 Enterin…

day41WEB 攻防-通用漏洞XMLXXE无回显DTD 实体伪协议代码审计

本章知识点: 1 、 XML&XXE- 原理 & 发现 & 利用 & 修复等 2 、 XML&XXE- 黑盒模式下的发现与利用 3 、 XML&XXE- 白盒模式下的审计与利用 4 、 XML&XXE- 无回显 & 伪协议 & 产生层面 配套资源(百度网盘&#x…

飞天使-linux操作的一些技巧与知识点7-devops

文章目录 简述devopsCICD 简述devops 让技术团队,运维,测试等团队实现一体式流程自动化 进阶版图 CICD 持续集成, 从编译,测试,发布的完成自动化流程 持续交付,包含持续集成,并且将项目部署…

代码随想录Day60 | 647. 回文子串 647. 回文子串

代码随想录Day60 | 647. 回文子串 647. 回文子串 647.回文子串516.最长回文子序列 647.回文子串 文档讲解:代码随想录 视频讲解: 动态规划,字符串性质决定了DP数组的定义 | LeetCode:647.回文子串 状态 dp数组 dp[i][j] 表示字符串…

有哪些适合程序员做的副业?

如果你经常玩知乎、看公众号(软件、工具、互联网这几类的)你就会发现,好多资源连接都变成了夸克网盘、迅雷网盘的资源链接。 例如:天涯神贴,基本上全是夸克、UC、迅雷网盘的资源链接。 有资源的前提下,迅雷…

泛微e-office系统敏感信息泄露漏洞

声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任 1、系统简介 泛微e-office系统是标准、易用、快速部署上线的专业协同OA软…

01VScode开发stm32环境搭建

title: VScode开发stm32环境搭建 tags: STM32vscode 1.准备工作 1.下载并安装VSCODE 在百度上搜索vscode记住一定要是官方的 不然你自己就是在给自己下毒2345全来了 打红圈一定要有不然就是在垃圾网站上下的 VSCode下载链接 选一个适合你的      安装正常流程走就行不再…

入侵检测系统的设计与实现

入侵检测系统(Intrusion Detection System,简称IDS)是一种能够监视网络或计算机系统活动的安全工具,旨在识别并响应可能的恶意行为或安全事件。这些事件可能包括未经授权的访问、恶意软件、拒绝服务攻击等。入侵检测系统通过不同的…

高并发Server的基石:reactor反应堆模式

业务开发同学只关心业务处理流程。但是我们开发的程序都是运行服务端server上,服务端server接收到IO请求后,是如何处理请求并最终进入业务流程的呢?这里不得不提到reactor反应堆模型。nginx tomcat redis nodejs dubbo等软件的网络处理模型都…

SwiftUI 支持拖放功能的集合视图(Grid)如何捕获手指按下并抬起这一操作

功能需求 假设我们开发了一款 SwiftUI 应用,其中用户可以通过拖放 Grid 中的 Cell 来完成一些操作。现在,我们希望用户在某个 Cell 被按下并随后抬起手指时得到通知,这能够实现吗? 如上图所示,我们准确地捕获到了手指在 Grid 的 Cell 上按下再抬起这一操作!那么它是如何…

Linux之ACL访问控制列表

一、ACL权限的介绍 1.1 什么是ACL 访问控制列表(ACL)是一种网络安全技术,它通过在网络设备(如路由器、交换机和防火墙)上定义一系列规则,对进出接口的数据包进行控制。这些规则可以包含“允许”&…

123 Linux C++ 系统编程2 Linux 上安装卸载程序三种方法,linux 下解压缩命令 tar介绍。kill命令,top命令,umask 命令

一 通过命令和网络直接安装 sudo apt-get update sudo apt-get update 的工作就是将自己本地 ubutun的软件列表和 aliyun 的软件列表对比,如不一样,则更新。 sudo apt-get install 软件名 真正的安装 那么这里就有一个问题了, 怎么从aliy…

【初始RabbitMQ】死信队列的实现

死信的概念 死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer 将消息投递到 broker 或者直接到 queue 里了,consumer 从 queue 取出消息 进行消费,但某些时候由于特定的原因导致…

认识HarmonyOS

1.认识HarmonyOS 1.1.HarmonyOS简介 在中美贸易战的刺激下,国产操作系统HarmonyOS(鸿蒙操作系统)开始进入到大众的视野。 鸿蒙寓意为“万物起源”,发展至今已经经过了好几个迭代版本。 1.1.1.早期鸿蒙雏形 LiteOS 2015 年 5 月 …

STM32F103x 的时钟源

AHB (Advanced High-performance Bus) 高速总线,用来接高速外设的。 APB (Advanced Peripheral Bus) 低速总线,用来接低速外设的,包含APB1 和 APB2。 APB1:上面连接的是低速外设,包括电源接口、备份接口、 CAN 、 US…

【Linux网络】网络编程套接字(TCP)

目录 地址转换函数 字符串IP转整数IP 整数IP转字符串IP 关于inet_ntoa 简单的单执行流TCP网络程序 TCP socket API 详解及封装TCP socket 服务端创建套接字 服务端绑定 服务端监听 服务端获取连接 服务端处理请求 客户端创建套接字 客户端连接服务器 客户端…

QT-串口工具

一、演示效果 二、关键程序 &#xff1a; #include "mainwindow.h" #include "ui_mainwindow.h"#include <QMessageBox>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow),listPlugins(QList<TabPluginInt…