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

设计模式之工厂模式:从汽车工厂到代码工厂

在这里插入图片描述

~犬📰余~

“我欲贱而贵,愚而智,贫而富,可乎?
曰:其唯学乎”

在这里插入图片描述

工厂模式概述

想象一下你走进一家4S店准备买车。作为顾客,你不需要知道汽车是如何被制造出来的,你只需要告诉销售顾问:“我想要一辆轿车"或"我想要一辆SUV”,他们就会为你安排相应的车型。这就是工厂模式的核心思想 —— 将对象的创建过程封装起来,让客户端与具体产品的创建逻辑解耦。
在软件开发中,工厂模式就像一个虚拟的4S店。当你的程序需要一个对象时,不需要直接使用new关键字来创建,而是通过工厂类来获取。这样做的好处是,如果将来需要更换对象的创建方式,或者增加新的对象类型,只需要修改工厂类的代码,而不会影响到使用这些对象的代码。
工厂模式通过将对象的创建和使用分离,实现了面向对象设计的一个重要原则:开闭原则(对扩展开放,对修改关闭)。就像4S店可以不断引入新的车型,而不会影响到已有客户的使用体验一样。

工厂模式分类

简单工厂模式

简单工厂就像一家小型的4S店,店里只有一个销售顾问,他根据顾客的需求直接安排相应的车型。在代码实现中,我们会创建一个工厂类,它提供一个创建对象的方法,根据传入的参数来决定创建哪种具体的产品对象。
如:

// 汽车接口
public interface Car {void drive();
}// 具体汽车类
public class SedanCar implements Car {@Overridepublic void drive() {System.out.println("驾驶轿车");}
}public class SUVCar implements Car {@Overridepublic void drive() {System.out.println("驾驶SUV");}
}// 简单工厂类
public class CarFactory {public static Car createCar(String type) {if ("sedan".equals(type)) {return new SedanCar();} else if ("suv".equals(type)) {return new SUVCar();}throw new IllegalArgumentException("不支持的车型类型");}
}

这种模式的使用非常简单:

Car sedanCar = CarFactory.createCar("sedan");
sedanCar.drive();Car suvCar = CarFactory.createCar("suv");
suvCar.drive();

执行结果:
在这里插入图片描述
如上示例,在简单工厂模式中,CarFactory类负责创建所有类型的汽车。这种方式适用于产品种类相对固定,创建逻辑不会经常变化的场景。就像一家小型4S店,经营的车型比较固定,不会经常变动。

工厂方法模式

工厂方法模式就像一个汽车制造集团,下设多个专门的工厂,每个工厂专注于生产一种类型的汽车。比如轿车工厂专门生产轿车,SUV工厂专门生产SUV。这样每个工厂都可以根据自己的特点来优化生产流程。
在代码中,我们会定义一个抽象的工厂接口,然后针对不同的产品创建专门的工厂类:

// 抽象工厂
public abstract class CarFactory {abstract Car createCar();
}// 具体工厂
public class SedanFactory extends CarFactory {@Overridepublic Car createCar() {return new SedanCar();}
}public class SUVFactory extends CarFactory {@Overridepublic Car createCar() {return new SUVCar();}
}

使用时,我们先选择对应的工厂,然后创建产品:

CarFactory sedanFactory = new SedanFactory();
Car sedan = sedanFactory.createCar();
sedan.drive();CarFactory suvFactory = new SUVFactory();
Car suv = suvFactory.createCar();
suv.drive();

运行结果:
在这里插入图片描述
与简单工厂相比,工厂方法模式将不同产品的创建过程分散到不同的工厂类中,每个工厂类都专注于创建自己的产品。这样在需要增加新产品时,只需要添加新的工厂类,而不需要修改现有的工厂类,更好地符合开闭原则。就像汽车集团可以轻松增加新的生产线,而不会影响现有工厂的运作。

抽象工厂模式

抽象工厂模式就像一个汽车制造集团不仅生产整车,还要生产发动机、车身等配套零部件。每个工厂都能生产一整套相关的产品,这些产品之间相互配套,形成一个产品族。比如轿车工厂生产轿车发动机和轿车车身,SUV工厂生产SUV发动机和SUV车身。如:

// 抽象产品
public interface Engine {void start();
}public interface Body {void assemble();
}// 具体产品
public class SedanEngine implements Engine {@Overridepublic void start() {System.out.println("轿车发动机启动");}
}public class SUVEngine implements Engine {@Overridepublic void start() {System.out.println("SUV发动机启动");}
}public class SedanBody implements Body {@Overridepublic void assemble() {System.out.println("组装轿车车身");}
}public class SUVBody implements Body {@Overridepublic void assemble() {System.out.println("组装SUV车身");}
}// 抽象工厂
public interface CarFactory {Engine createEngine();Body createBody();
}// 具体工厂
public class SedanFactory implements CarFactory {@Overridepublic Engine createEngine() {return new SedanEngine();}@Overridepublic Body createBody() {return new SedanBody();}
}public class SUVFactory implements CarFactory {@Overridepublic Engine createEngine() {return new SUVEngine();}@Overridepublic Body createBody() {return new SUVBody();}
}

测试代码如下:

// 生产轿车系列产品
System.out.println("=== 生产轿车系列 ===");
CarFactory sedanFactory = new SedanFactory();
Engine sedanEngine = sedanFactory.createEngine();
Body sedanBody = sedanFactory.createBody();// 组装轿车
sedanEngine.start();  // 输出:轿车发动机启动
sedanBody.assemble(); // 输出:组装轿车车身System.out.println("\n=== 生产SUV系列 ===");
// 生产SUV系列产品
CarFactory suvFactory = new SUVFactory();
Engine suvEngine = suvFactory.createEngine();
Body suvBody = suvFactory.createBody();// 组装SUV
suvEngine.start();    // 输出:SUV发动机启动
suvBody.assemble();   // 输出:组装SUV车身

运行结果:
在这里插入图片描述

工厂模式优缺点

  • 简单工厂模式就像一个小型4S店,结构简单,使用方便。它的优点是实现简单,客户端只需要知道产品的参数就可以了;缺点是工厂类的职责相对过重,增加新产品时需要修改工厂类的代码,违反了开闭原则。
  • 工厂方法模式像一个汽车制造集团下的多个专业工厂,每个工厂专注于一种产品。它的优点是符合开闭原则,扩展性好,增加新产品只需要增加相应的工厂类;缺点是类的数量会随着产品的增加而增加,增加了系统的复杂度。
  • 抽象工厂模式则像一个全产业链的汽车制造集团,可以生产多个产品族。它的优点是能够保证一系列相关产品的配套性,支持产品族的扩展;缺点是抽象层次较高,增加新的产品部件时麻烦,需要修改所有的工厂类。

如何选择工厂模式的实现方式

  • 如果你的应用场景简单,产品种类较少且相对稳定,可以选择简单工厂模式。就像开一家小型4S店,只经营几种固定车型。
  • 如果产品种类会经常变动,建议使用工厂方法模式。这就像汽车制造集团可以根据市场需求灵活增加新的生产线。
  • 如果你需要创建一系列相互关联的产品,那么抽象工厂模式是最好的选择。这适合于像汽车制造这样需要协调多个配套零部件生产的场景。

总结

工厂模式是一种创建型设计模式,它通过将对象的创建与使用分离,提供了一种灵活的对象创建方式。简单工厂适合简单场景,工厂方法适合单个产品的变化,抽象工厂适合产品族的扩展。理解这三种模式的特点和使用场景,可以帮助我们在实际开发中选择最适合的实现方式。
在这里插入图片描述

关注犬余,共同进步

技术从此不孤单

相关文章:

设计模式之工厂模式:从汽车工厂到代码工厂

~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” 工厂模式概述 想象一下你走进一家4S店准备买车。作为顾客,你不需要知道汽车是如何被制造出来的,你只需要告诉销售顾问&a…...

在 Ubuntu 20.04 上离线安装和配置 Redis

下面是从零开始配置 Redis 的完整步骤,包括从安装 Redis 到离线安装 Redis 包的步骤。本文将覆盖如何从下载 Redis 安装包、手动安装 Redis、创建所需目录、配置 Redis、以及如何配置 Redis 为系统服务,确保服务可以在启动时自动运行。 步骤 1: 准备环境…...

Redis的哨兵机制

目录 1. 文章前言2. 基本概念2.1 主从复制的问题2.2 人工恢复主节点故障2.3 哨兵机制自动恢复主节点故障 3. 安装部署哨兵(基于docker)3.1 安装docker3.2 编排redis主从节点3.3 编排redis-sentinel节点 4. 重新选举5. 选举原理6. 总结 1. 文章前言 &…...

服务器数据恢复—热备盘上线过程中硬盘离线导致raid5阵列崩溃的数据恢复案例

服务器数据恢复环境: 两组分别由4块SAS接口硬盘组建的raid5阵列,两组raid5阵列划分LUN并由LVM管理,格式化为EXT3文件系统。 服务器故障: RAID5阵列中一块硬盘未知原因离线,热备盘自动激活上线替换离线硬盘。在热备盘上…...

Android12 设置无home属性的apk为launcher

目标apk的包类名 QSSI.12/device/qcom/qssi/system.prop// add start target_app_package_name=com.mangechargespot.app target_app_class_name=com.mangechargespot.app.ui.activity.SplashActivity // add end...

STM32F407+LAN8720A +LWIP +FreeRTOS ping通

使用STM32CUBEIDE自带的 LWIP和FreeROTS 版本说明STM32CUBEIDE 操作如下1. 配置RCC/SYS2. 配置ETH/USART3. 配置EHT_RESET/LED4. 配置FreeRTOS5. 配置LWIP6. 配置时钟7. 生成单独的源文件和头文件,并生成代码8. printf重定义9. ethernetif.c添加lan8720a复位10. MY_LWIP_Init …...

构建虚幻引擎中的HUD与UI

在游戏开发中,用户界面(UI)和头部显示(HUD)是玩家体验的重要组成部分。它们提供了关键信息,并增强了游戏的互动性。虚幻引擎(Unreal Engine, UE)以其强大的可视化脚本系统Blueprint和C++ API支持,为开发者提供了一个灵活且功能丰富的环境来创建复杂的UI和HUD元素。 本…...

EXCEL数据清洗的几个功能总结备忘

目录 0 参考教材 1 用EXCEL进行数据清洗的几个功能 2 删除重复值: 3 找到缺失值等 4 大小写转换 5 类型转化 6 识别空格 0 参考教材 精通EXCEL数据统计与分析,中国,李宗璋用EXCEL学统计学,日EXCEL统计分析与决策&#x…...

【CSS in Depth 2 精译_076】12.4 @font-face 的工作原理

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 12.2 Web 字体12.3 谷歌字体12.4 font-fac…...

深入源码解析:Spring Boot 如何加载 Servlet 、Filter 与 Listener

我们知道,Spring Boot 是在 Spring MVC 的基础上进行了封装,以简化开发者的工作量。尽管如此,Spring Boot 的底层架构依然离不开 Spring MVC 的核心组件,如 Servlet、Filter、Listener,以及RequestMappingHandlerMappi…...

Vue 让视图区域滑到指定位置、回到顶部

滑倒指定位置&#xff1a;获取指定的dom&#xff0c;然后用scrollIntoView使dom出现在视图区域 回到顶部&#xff1a;操作父级dom的scrollTop 0&#xff0c;让该父级下的列表回到顶部 代码如下 <template><div class"testDemo"><div><el-bu…...

C# 属性(Property)

C# 属性(Property) C# 中的属性(Property)是一种用于访问和设置类或结构成员的值的特殊类型的方法。属性允许开发者以字段的形式访问方法,提供了更为安全和灵活的数据封装。在本文中,我们将深入探讨 C# 属性的概念、用途、以及如何有效地使用它们。 属性的定义 属性由…...

Ubuntu20.04调整swap分区大小笔记

Ubuntu20.04调整swap分区大小笔记 参考&#xff1a;https://blog.csdn.net/sunyuhua_keyboard/article/details/142485764 第一步 禁用swap $ cat /etc/fstab # /etc/fstab: static file system information. # # Use blkid to print the universally unique identifier fo…...

【 JAVA中常见的集合操作】

JAVA中常见的集合操作 Java 提供了丰富的集合框架&#xff08;Java Collections Framework&#xff09;&#xff0c;包括多种集合接口和实现类。集合操作可以分为基本操作和高级操作。下面介绍一些常见的集合操作&#xff0c;并给出相应的代码示例。 基本集合操作 创建集合 …...

Kudu 源码编译-aarch架构 1.17.1版本

跟着官方文档编译 第一个问题&#xff1a;在make阶段时会报的问题&#xff1a; kudu/src/kudu/util/block_bloom_filter.cc:210:3: error: ‘vst1q_u32_x2’ was not declared in this scope kudu/src/kudu/util/block_bloom_filter.cc:436:5: error: ‘vst1q_u8_x2’ was no…...

JavaEE多线程案例之阻塞队列

上文我们了解了多线程案例中的单例模式&#xff0c;此文我们来探讨多线程案例之阻塞队列吧 1. 阻塞队列是什么&#xff1f; 阻塞队列是⼀种特殊的队列.也遵守"先进先出"的原则. 阻塞队列是⼀种线程安全的数据结构,并且具有以下特性: 当队列满的时候,继续⼊队列就会…...

Java Web 开发学习中:过滤器与 Ajax 异步请求

一、过滤器 Filter&#xff1a; 过滤器的概念与用途 在一个庞大的 Web 应用中&#xff0c;有许多资源需要受到保护或进行特定的预处理。过滤器就像是一位智能的守卫&#xff0c;站在资源的入口处&#xff0c;根据预先设定的规则&#xff0c;决定哪些请求可以顺利访问资源&…...

git SSL certificate problem: unable to get local issuer certificate

Git 客户端将会验证服务器端提供的SSL证书是否由受信任的证书颁发机构&#xff08;Certification Authority&#xff0c;CA&#xff09;签发。如果Git客户端无法找到或验证本地签发者证书&#xff0c;就会出现 unable to get local issuer certificate 或类似的错误。 该问题一…...

Vue.js 响应接口

Vue.js 响应接口 Vue.js,作为一个流行的前端JavaScript框架,以其响应式数据绑定和组件化开发而闻名。响应式系统是Vue.js的核心特性之一,它允许开发者创建高度动态和交互式的用户界面。本文将深入探讨Vue.js的响应接口,包括其工作原理、使用方法和最佳实践。 响应式原理 …...

vue2-代理打包问题;CORS针对AJAX 请求,而不适用于资源请求

打包后请求被转发出现问题&#xff08;如返回 405 Method Not Allowed&#xff09;&#xff0c;通常是由以下原因导致的&#xff1a; 1. 代理配置未生效 原因分析 在开发环境中&#xff0c;Vue CLI 的 devServer.proxy 仅在本地开发服务器&#xff08;npm run serve&#xff…...

websocket 服务 pinia 全局配置

websocket 方法类 // stores/webSocketStore.ts import { defineStore } from "pinia";interface WebSocketStoreState {ws: WebSocket | null; // WebSocket 实例callbacks: ((message: string) > void)[]; // 消息回调函数列表connected: boolean; // 连接状态…...

YOLO系列正传(二)YOLOv3论文精解(上)——从FPN到darknet-53

系列文章 YOLO系列基础 YOLO系列基础合集——小白也看得懂的论文精解-CSDN博客 YOLO系列正传 YOLO系列正传系列&#xff08;一&#xff09;类别损失与MSE损失函数、交叉熵损失函数-CSDN博客 背景 随着YOLOv11版本的发布&#xff0c;YOLO算法在视觉检测领域独领风骚&#x…...

可视化建模与UML《部署图实验报告》

一、实验目的&#xff1a; 1、熟悉部署图的基本功能和使用方法。 2、掌握使用建模工具软件绘制部署图的方法 二、实验环境&#xff1a; window11 EA15 三、实验内容&#xff1a; 根据以下的描述&#xff0c;绘制部署图。 网上选课系统在服务器端使用了两台主机&#xff0c;一…...

详解RabbitMQ在Ubuntu上的安装

​​​​​​​ 目录 Ubuntu 环境安装 安装Erlang 查看Erlang版本 退出命令 ​编辑安装RabbitMQ 确认安装结果 安装RabbitMQ管理界面 启动服务 查看服务状态 通过IP:port访问 添加管理员用户 给用户添加权限 再次访问 Ubuntu 环境安装 安装Erlang RabbitMq需要…...

SQL 快速参考

SQL 快速参考 引言 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系数据库管理系统&#xff08;RDBMS&#xff09;的标准编程语言。它被广泛用于数据查询、数据更新、数据库维护以及访问控制。本快速参考指南旨在提供SQL的基本概念和常用命令的概览…...

数据结构--树和二叉树

树和二叉树的定义 树的定义 树是一种非线性的数据结构&#xff0c;它模拟了具有层次关系的数据的集合。在树结构中&#xff0c;存在以下基本概念&#xff1a; 节点&#xff08;Node&#xff09;&#xff1a;树的每个元素被称为节点。根节点&#xff08;Root Node&#xff09…...

R语言的数据结构-向量

【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言编程_夏天又到了的博客-CSDN博客 在R语言中&#xff0c;数据结构是非常关键的部分&#xff0c;它提…...

MetaGPT源码 (ContextMixin 类)

目录 理解 ContextMixin什么是 ContextMixin&#xff1f;主要组件实现细节 测试 ContextMixin示例&#xff1a;ModelX1. 配置优先级2. 多继承3. 多继承重写4. 配置优先级 在本文中&#xff0c;我们将探索 ContextMixin 类&#xff0c;它在多重继承场景中的集成及其在 Python 配…...

linux中top命令详解

top 命令是 Linux 系统中常用的实时系统监控工具&#xff0c;它可以显示系统的实时进程和资源占用情况。以下是 top 命令的一些基本用法和参数详解&#xff1a; 基本用法 • top&#xff1a;运行 top 命令&#xff0c;显示系统实时监控信息。 • top -h&#xff1a;显示帮助信…...

Scrapy与MongoDB

Scrapy可以在非常短的时间里获取大量的数据。这些数据无论是直接保存为纯文本文件还是CSV文件&#xff0c;都是不可取的。爬取一个小时就可以让这些文件大到无法打开。这个时候&#xff0c;就需要使用数据库来保存数据了。 MongoDB由于其出色的性能&#xff0c;已经成为爬虫的首…...

【Linux-ubuntu通过USB传输程序点亮LED灯】

Linux-ubuntu通过USB传输程序点亮LED灯 一,初始化GPIO配置1.使能时钟2.其他寄存器配置 二&#xff0c;程序编译三&#xff0c;USB传输程序 一,初始化GPIO配置 1.使能时钟 使能就是一个控制信号&#xff0c;用于决定时钟信号是否能够有效的传递或者被使用&#xff0c;就像一个…...

onlyoffice 容器配置修改后制作镜像导出以及上传到 dockerhub

1.将容器制作成新的镜像 docker commit -p -a "xxx" -m "zh-cn-20-100" onlyoffice ooffice:7.1.1.23docker commit: 这是 Docker 中用于创建新镜像的命令。 -p: 这个选项用于在提交之前暂停容器的运行。这可以确保数据的完整性&#xff0c;因为容器在提交…...

开发者如何使用GCC提升开发效率 Windows下Cmake + NDK 交叉编译 Libyuv

最近在导入其他项目的libyuv库&#xff0c;编译时发现如下问题&#xff0c;刚好想做一期libyuv编译与安装到AS中的文章&#xff0c;故记录集成的全过程 报错如下 error: no member named ABGRToNV21 in namespace libyuv; did you mean ARGBToNV21? error: no member named …...

前端H5移动端基础框架模板 :Vue3 + Vite5 + Pinia + Vant4 + Sass + 附源码

技术栈选用 Vue3 Vite5 Pinia Vant4 Sass 源码地址&#xff1a; git clone https://gitee.com/gaiya001/h5-APP.git1. 1.vite.config.js文件配置 ** import { defineConfig } from vite // 导入 Vite 的配置函数 import vue from vitejs/plugin-vue // 导入 Vue 插件 i…...

华为HCIP H12-821考试中心原题题库更新完成 展示如下

全题库506题&#xff0c;后期有更新会及时更新维护&#xff0c;确保答案正确率和原题覆盖率。 ​​​​​​​ 附上最新通过成绩单一张 今天新鲜出炉 ​​​​​​​...

SQL Server:只有MDF文件,如何附加数据库

第一步&#xff1a;先新建一个同名数据库&#xff0c;然后停止sql服务&#xff0c;删除新建数据库.ldf文件。 第二步&#xff1a;将要附加的数据库的.mdf文件覆盖刚新建的.mdf文件&#xff0c;并重启sql服务。 第三步&#xff1a;这时数据库DATA目录下只有一个.mdf文件&#xf…...

nginx反向代理(负载均衡)和tomcat介绍

nginx的代理 负载均衡 负载均衡的算法 负载均衡的架构 基于ip的七层代理 upstream模块要写在http模块中 七层代理的调用要写在location模块中 轮询 加权轮询 最小连接数 ip_Hash URL_HASH 基于域名的七层代理 配置主机 给其余客户机配置域名 给所有机器做域名映射 四层代理…...

【前端】-【前端文件操作与文件上传】-【前端接受后端传输文件指南】

目录 前端文件操作与文件上传前端接受后端传输文件指南前端excel、word操作指南 excelword 前端文件操作与文件上传 一、前端文件上传有两种思路&#xff1a; 二进制blob传输&#xff1a;典型案例是formData传输&#xff0c;相当于用formData搭载二进制的blob传给后端base…...

Android IO 性能优化:全面解析与实践

文章目录 前言1、文件系统与 I/O 流程原理1.1 文件系统架构1.2 文件 I/O 流程 2、优化策略与场景适用2.1 异步 I/O2.2 合并文件操作2.3 页缓存优化2.4 内存映射文件 3. 性能监控与验证总结 前言 在现代 Android 应用中&#xff0c;I/O 性能直接影响用户体验。流畅的响应速度和…...

利用Docker分层构建优化镜像大小

合适docker镜像文件大小不仅影响容器启动效率&#xff0c;也影响资源占用效率。本文介绍如何利用分层方式构建docker镜像&#xff0c;采用多种方式避免镜像文件太大而影响性能。 Docker 镜像大小优化的重要性 资源利用效率 较小的镜像文件在存储和传输过程中占用更少的空间和带…...

【代码pycharm】动手学深度学习v2-09 Softmax 回归 + 损失函数 + 图片分类数据集

课程链接 1.读取图像分类数据集 import matplotlib.pyplot as plt import torch import torchvision from torch.utils import data from torchvision import transforms from d2l import torch as d2l d2l.use_svg_display() #读取数据集 transtransforms.ToTensor() mnist_…...

docker开启远程访问

1、编辑docker.server文件 vi /usr/lib/systemd/system/docker.service 找到 [Service] 节点&#xff0c;修改 ExecStart 属性&#xff0c;增加 -H tcp://0.0.0.0:2375 ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock -H tcp://0.0.0.0:2…...

Maven插件打包发布远程Docker镜像

dockerfile-maven-plugin插件的介绍 dockerfile-maven-plugin目前这款插件非常成熟&#xff0c;它集成了Maven和Docker&#xff0c;该插件的官方文档地址如下&#xff1a; 地址&#xff1a;https://github.com/spotify/dockerfile-maven 其他说明&#xff1a; dockerfile是用…...

基于STM32的太阳跟踪系统设计

目录 引言系统设计 硬件设计软件设计系统功能模块 太阳位置检测模块伺服驱动控制模块反馈调整模块电源管理模块控制算法 太阳位置估算算法跟踪调整算法代码实现 太阳位置检测与估算伺服电机控制系统反馈与调整系统调试与优化结论与展望 1. 引言 太阳能是一种清洁、可再生的能…...

004-Redis 持久化

Redis 持久化 一、RDB 持久化1.优点&#xff1a;2.缺点&#xff1a;3.实现方式&#xff1a; 二、AOF 持久化1.优点&#xff1a;2.缺点&#xff1a;3.实现方式&#xff1a;4.重写机制5.重写流程&#xff1a; Redis 提供了两种主要的持久化方式&#xff1a;RDB 和 AOF 一、RDB 持…...

类OCSP靶场-Kioptrix系列-Kioptrix Level 1

一、前情提要 Kioptrix Level是免费靶场&#xff0c;可以自己百度下载。 开始前要先将靶机设置和kali同一个网络模式&#xff0c;我这里设置的是NAT。 接下来的靶机用kali进行演示。 二、打靶演示 这个靶机练习&#xff0c;相当于内网渗透。 1. 信息收集 1.1. 主机发现 …...

短视频矩阵系统功能介绍与独立部署流程

一、短视频矩阵系统功能介绍 短视频矩阵系统&#xff0c;作为当前短视频运营的重要工具&#xff0c;凭借其强大的功能&#xff0c;为内容创作者和企业提供了高效、便捷的短视频管理与运营方案。以下是对该系统核心功能的详细介绍&#xff1a; 多平台账号管理&#xff…...

【AI知识】人工智能、机器学习、深度学习的概念与联系

下图来自博客 机器学习和深度学习概念入门 &#xff0c;图中可明显看到人工智能、机器学习、深度学习三个概念的包含关系&#xff0c;下面简单介绍一下这三个概念已经它们之间的联系。 1. 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09; 概念&#x…...

今天你学C++了吗?——C++中的类与对象(日期类的实现)——实践与知识的碰撞❤

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

一个简单带颜色的Map

越简单 越实用。越少设计&#xff0c;越易懂。 需求背景&#xff1a; 创建方法&#xff0c;声明一个hashset&#xff0c; 元素为 {“#DE3200”, “#FA8C00”, “#027B00”, “#27B600”, “#5EB600”} 。 对应的key为 key1 、key2、key3、key4、key5。 封装该方法&#xff0c…...