当前位置: 首页 > news >正文

设计模式-抽象工厂模式实践案例

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式是围绕一个超级工厂创建其他工厂的模式。该模式的实现涉及到多个类和对象。

下面是一个抽象工厂模式的 Java 实践案例,假设我们有两种类型的产品(按钮和文本框),并且每种产品有两种不同的风格(Windows 风格和 MacOS 风格)。

步骤1:为每种类型的产品定义接口

1// 按钮产品接口
2public interface Button {
3    void paint();
4}
5
6// 文本框产品接口
7public interface TextBox {
8    void paint();
9}

步骤2:为每种风格的产品实现具体类

1// Windows 风格的按钮
2public class WindowsButton implements Button {
3    @Override
4    public void paint() {
5        System.out.println("Rendering a button in a Windows style.");
6    }
7}
8
9// MacOS 风格的按钮
10public class MacOSButton implements Button {
11    @Override
12    public void paint() {
13        System.out.println("Rendering a button in a MacOS style.");
14    }
15}
16
17// Windows 风格的文本框
18public class WindowsTextBox implements TextBox {
19    @Override
20    public void paint() {
21        System.out.println("Rendering a text box in a Windows style.");
22    }
23}
24
25// MacOS 风格的文本框
26public class MacOSTextBox implements TextBox {
27    @Override
28    public void paint() {
29        System.out.println("Rendering a text box in a MacOS style.");
30    }
31}

步骤3:创建抽象工厂接口

1public interface GUIFactory {
2    Button createButton();
3    TextBox createTextBox();
4}

步骤4:为每种风格实现具体的工厂类

1// Windows 风格的工厂
2public class WindowsFactory implements GUIFactory {
3    @Override
4    public Button createButton() {
5        return new WindowsButton();
6    }
7
8    @Override
9    public TextBox createTextBox() {
10        return new WindowsTextBox();
11    }
12}
13
14// MacOS 风格的工厂
15public class MacOSFactory implements GUIFactory {
16    @Override
17    public Button createButton() {
18        return new MacOSButton();
19    }
20
21    @Override
22    public TextBox createTextBox() {
23        return new MacOSTextBox();
24    }
25}

步骤5:客户端代码使用抽象工厂

1public class Client {
2    private Button button;
3    private TextBox textBox;
4
5    public Client(GUIFactory factory) {
6        button = factory.createButton();
7        textBox = factory.createTextBox();
8    }
9
10    public void paint() {
11        button.paint();
12        textBox.paint();
13    }
14
15    public static void main(String[] args) {
16        Client client;
17
18        // 使用 Windows 风格的工厂
19        client = new Client(new WindowsFactory());
20        client.paint();
21
22        // 使用 MacOS 风格的工厂
23        client = new Client(new MacOSFactory());
24        client.paint();
25    }
26}

在这个例子中,GUIFactory 是一个抽象工厂,它定义了创建一组 GUI 组件的方法。WindowsFactory 和 MacOSFactory 是两个具体的工厂,它们实现了 GUIFactory 并创建对应风格的 GUI 组件。

客户端代码通过抽象工厂接口来创建 GUI 组件,这样无论是 Windows 风格还是 MacOS 风格的 GUI 组件,都不需要修改客户端的逻辑。

抽象工厂模式的优点是,它支持对产品系列的扩展。如果我们想要添加一个新的产品风格(比如 Linux 风格),我们只需要添加一个新的工厂和一组产品类,而不需要修改现有代码。这种模式也有助于保持家族产品的一致性,确保客户端始终同时使用某个家族的所有产品。

相关文章:

设计模式-抽象工厂模式实践案例

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式是围绕一个超级工厂创建其他工厂的模式。该模式的实现涉及…...

用readproc函数读取进程的状态

概要&#xff1a; 本篇演示用readproc函数读取进程的状态 libprocps库的安装参考笔者的文章readproc.h-CSDN博客 演示所用的系统是Ubuntu22.04 一、代码 #include<stdio.h> #include<stdlib.h> #include<proc/readproc.h> int main() {struct PROCTAB *…...

在高并发、高性能、高可用 三高项目中如何设计适合实际业务场景的分布式id(一)

分布式ID组件&#xff1a;黄金链路上的关键基石 在现代分布式系统中&#xff0c;分布式ID组件无疑扮演着至关重要的角色。作为整个系统的黄金链路上的关键组件&#xff0c;它的稳定性和可靠性直接关乎到整个系统的正常运作。一旦分布式ID组件出现问题&#xff0c;黄金链路上的…...

redis最新版本在Windows系统上的安装

一、说明 这次安装操作主要是根据redis官网说明&#xff0c;一步步安装下来的&#xff0c;英语比较好的同学&#xff0c;可以直接看文章底部的超链接1&#xff0c;跳到官网按步操作即可。 目前redis的最新稳定版本为redis7.2。 二、Windows环境改造 Redis在Windows上不被官方…...

【深度优先】【图论】【C++算法】2045. 到达目的地的第二短时间

作者推荐 视频算法专题 LeetCode2045. 到达目的地的第二短时间 城市用一个 双向连通 图表示&#xff0c;图中有 n 个节点&#xff0c;从 1 到 n 编号&#xff08;包含 1 和 n&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中每个 edges[i] [ui, vi] 表…...

思维题(蓝桥杯 填空题 C++)

目录 题目一&#xff1a; ​编辑 代码&#xff1a; 题目二&#xff1a; 代码&#xff1a; 题目三&#xff1a; 代码&#xff1a; 题目四&#xff1a; 代码&#xff1a; 题目五&#xff1a; 代码&#xff1a; 题目六&#xff1a; 代码七&#xff1a; 题目八&#x…...

Meta的Llama2模型已上线!但我为何更推荐你从HuggingFace获取?还有Code Llama等你来解锁!

嘿&#xff0c;朋友们&#xff0c;今天给你们介绍一个新东西——Llama2模型&#xff0c;这是Meta&#xff08;对&#xff0c;就是Facebook那家&#xff09;推出的。 你可以直接去Llama的官网下载这个模型&#xff0c;然后按照他们GitHub上的指南来调用。 不过呢&#xff0c;我…...

CAN总线及通讯的工作原理

一、CAN总线 CAN是控制器局域网络(Controller Area Network)的简称&#xff0c; 它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的&#xff0c; 并最终成为国际标准&#xff08;ISO11519&#xff09;&#xff0c;是国际上应用最广泛的现场总线之一。 二、工作原理 …...

linux下修改网卡MAC地址

我建议你使用 macchanger&#xff0c;但如果你不想使用它&#xff0c;那么可以使用另一种方法在 Linux 中更改 MAC 地址。 首先&#xff0c;使用以下命令关闭网卡&#xff1a; sudo ip link set dev enp0s31f6 down 接下来&#xff0c;使用以下命令设置新的 MAC&#xff1a;…...

47、WEB攻防——通用漏洞Java反序列化EXP生成数据提取组件安全

文章目录 序列化和反序列化的概念&#xff1a; 序列化&#xff1a;把java对象转换成字节流的过程&#xff1b;反序列化&#xff1a;把字节流恢复为java对象的过程。 对象的序列化主要有两种用途&#xff1a; 把对象的字节流永久的保存在硬盘上&#xff0c;通常存放在一个文件…...

phpstorm console xdebug

1.所有配置跟浏览器http请求一样 2.记得Current File 必须是controller文件 注意&#xff1a;如果没有出发断点&#xff0c;则echo phpinfo(),查看remote_port 和phpstorm 配置是否对上。...

Vue template到render过程

Vue template到render过程 vue的模版编译过程主要如下&#xff1a;template -> ast -> render函数&#xff08;1&#xff09;调用parse方法将template转化为ast&#xff08;抽象语法树&#xff09;&#xff08;2&#xff09;对静态节点做优化&#xff08;3&#xff09;生…...

【你也能从零基础学会网站开发】Web建站之HTML+CSS入门篇 CSS常用属性

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 CSS常用属性…...

Golang 写日志到文件

package mainimport ("log""os""time" )func main() {printLog("auto", "报警内容AA") }func printLog(filename string, content string) {t : time.Now().Format(time.DateOnly)file : filename "." t "…...

数字孪生10个技术栈:数据处理的六步骤,以获得可靠数据。

一、什么是数据处理 在数字孪生中&#xff0c;数据处理是指对采集到的实时或历史数据进行整理、清洗、分析和转化的过程。数据处理是数字孪生的基础&#xff0c;它将原始数据转化为有意义的信息&#xff0c;用于模型构建、仿真和决策支持。 数据处理是为了提高数据质量、整合数…...

运维随录实战(5)之centos搭建jenkins

一,搭建jenkins准备 下载安装jdk环境 -》版本 jdk11 下载安装maven环境 -》版本 maven 3.8.8 git -》版本 1.8.3.1 yum install git jenkins安装版本:2.414.3 下载地址:https://get.jenkins.io/war-stable/2.414.3/jenkins.war 注:jenkins版本与jdk版本有一定的对应关…...

css clip-path polygon属性实现直角梯形

2024.3.8今天我学习了如何用css实现直角梯形的效果&#xff0c; 效果&#xff1a; 具体实现原理&#xff1a; 一、需要三个div&#xff1a; 外面一个大的div&#xff0c;里面左右两个小的div 我们需要先把第一个div变成直角梯形&#xff1a; 大概是这样&#xff0c;设置好之…...

Manz高压清洗机S11-028GCH-High Quality Cleaner 操作使用说明492页

Manz高压清洗机S11-028GCH-High Quality Cleaner 操作使用说明492页...

图像处理与视觉感知---期末复习重点(2)

文章目录 一、空间域图像增强1.1 图像增强1.2 几种变换 二、直方图2.1 直方图定义2.2 直方图均衡化2.3 离散情况2.4 例子2.5 直方图匹配2.6 例子2.7 一道例题 三、空间滤波器3.1 定义3.2 例子 四、平滑空间滤波器4.1 作用与分类4.2 线性滤波器 五、统计排序滤波器5.1 定义与分类…...

【机器学习】三要素——数据、模型、算法

机器学习三要素 数据模型模型是怎么得到的&#xff1f;算法 我 在学习过程中,对于“模型”和“算法”的概念不清晰&#xff0c;一直混淆&#xff0c;通过查阅了一些资料在此总结一下。 数据、模型与算法被称为机器学习的三要素&#xff0c;因为它们在机器学习中具有不可分割的作…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...