设计模式-抽象工厂模式实践案例
抽象工厂模式(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函数读取进程的状态
概要: 本篇演示用readproc函数读取进程的状态 libprocps库的安装参考笔者的文章readproc.h-CSDN博客 演示所用的系统是Ubuntu22.04 一、代码 #include<stdio.h> #include<stdlib.h> #include<proc/readproc.h> int main() {struct PROCTAB *…...
在高并发、高性能、高可用 三高项目中如何设计适合实际业务场景的分布式id(一)
分布式ID组件:黄金链路上的关键基石 在现代分布式系统中,分布式ID组件无疑扮演着至关重要的角色。作为整个系统的黄金链路上的关键组件,它的稳定性和可靠性直接关乎到整个系统的正常运作。一旦分布式ID组件出现问题,黄金链路上的…...
redis最新版本在Windows系统上的安装
一、说明 这次安装操作主要是根据redis官网说明,一步步安装下来的,英语比较好的同学,可以直接看文章底部的超链接1,跳到官网按步操作即可。 目前redis的最新稳定版本为redis7.2。 二、Windows环境改造 Redis在Windows上不被官方…...
【深度优先】【图论】【C++算法】2045. 到达目的地的第二短时间
作者推荐 视频算法专题 LeetCode2045. 到达目的地的第二短时间 城市用一个 双向连通 图表示,图中有 n 个节点,从 1 到 n 编号(包含 1 和 n)。图中的边用一个二维整数数组 edges 表示,其中每个 edges[i] [ui, vi] 表…...
思维题(蓝桥杯 填空题 C++)
目录 题目一: 编辑 代码: 题目二: 代码: 题目三: 代码: 题目四: 代码: 题目五: 代码: 题目六: 代码七: 题目八&#x…...
Meta的Llama2模型已上线!但我为何更推荐你从HuggingFace获取?还有Code Llama等你来解锁!
嘿,朋友们,今天给你们介绍一个新东西——Llama2模型,这是Meta(对,就是Facebook那家)推出的。 你可以直接去Llama的官网下载这个模型,然后按照他们GitHub上的指南来调用。 不过呢,我…...
CAN总线及通讯的工作原理
一、CAN总线 CAN是控制器局域网络(Controller Area Network)的简称, 它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的, 并最终成为国际标准(ISO11519),是国际上应用最广泛的现场总线之一。 二、工作原理 …...
linux下修改网卡MAC地址
我建议你使用 macchanger,但如果你不想使用它,那么可以使用另一种方法在 Linux 中更改 MAC 地址。 首先,使用以下命令关闭网卡: sudo ip link set dev enp0s31f6 down 接下来,使用以下命令设置新的 MAC:…...
47、WEB攻防——通用漏洞Java反序列化EXP生成数据提取组件安全
文章目录 序列化和反序列化的概念: 序列化:把java对象转换成字节流的过程;反序列化:把字节流恢复为java对象的过程。 对象的序列化主要有两种用途: 把对象的字节流永久的保存在硬盘上,通常存放在一个文件…...
phpstorm console xdebug
1.所有配置跟浏览器http请求一样 2.记得Current File 必须是controller文件 注意:如果没有出发断点,则echo phpinfo(),查看remote_port 和phpstorm 配置是否对上。...
Vue template到render过程
Vue template到render过程 vue的模版编译过程主要如下:template -> ast -> render函数(1)调用parse方法将template转化为ast(抽象语法树)(2)对静态节点做优化(3)生…...
【你也能从零基础学会网站开发】Web建站之HTML+CSS入门篇 CSS常用属性
🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 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个技术栈:数据处理的六步骤,以获得可靠数据。
一、什么是数据处理 在数字孪生中,数据处理是指对采集到的实时或历史数据进行整理、清洗、分析和转化的过程。数据处理是数字孪生的基础,它将原始数据转化为有意义的信息,用于模型构建、仿真和决策支持。 数据处理是为了提高数据质量、整合数…...
运维随录实战(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实现直角梯形的效果, 效果: 具体实现原理: 一、需要三个div: 外面一个大的div,里面左右两个小的div 我们需要先把第一个div变成直角梯形: 大概是这样,设置好之…...
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 定义与分类…...
【机器学习】三要素——数据、模型、算法
机器学习三要素 数据模型模型是怎么得到的?算法 我 在学习过程中,对于“模型”和“算法”的概念不清晰,一直混淆,通过查阅了一些资料在此总结一下。 数据、模型与算法被称为机器学习的三要素,因为它们在机器学习中具有不可分割的作…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
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 提…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
