设计模式 - 工厂模式 精准梳理精准记忆
1、代码片段 - 带入理解
一、核心模式分类
- 简单工厂模式(编程习惯,非 GoF 设计模式)
- 工厂方法模式(GoF 创建型模式)
- 抽象工厂模式(GoF 创建型模式)
二、演变过程:咖啡店案例
初始实现
// 咖啡基类
abstract class Coffee {public abstract String getName();
}class AmericanCoffee extends Coffee {}
class LatteCoffee extends Coffee {}// 咖啡店直接创建对象
class CoffeeStore {public Coffee orderCoffee(String type) {if ("american".equals(type)) {return new AmericanCoffee();} else {return new LatteCoffee();}}
}
问题 违反开闭原则,新增咖啡类型需修改订单方法
三、改进方案演变
1、简单工厂模式
class SimpleCoffeeFactory {public Coffee createCoffee(String type) {// 创建逻辑...}
}class CoffeeStore {private SimpleCoffeeFactory factory;public Coffee orderCoffee(String type) {return factory.createCoffee(type);}
}
- 优点 解耦对象创建
- 缺点 仍需修改工厂代码,违反开闭原则
2、工厂方法模式
interface CoffeeFactory {Coffee createCoffee();
}class AmericanFactory implements CoffeeFactory {public Coffee createCoffee() { return new AmericanCoffee(); }
}class CoffeeStore {private CoffeeFactory factory;public void setFactory(CoffeeFactory factory) {this.factory = factory;}public Coffee orderCoffee() {return factory.createCoffee();}
}
- 优点 完全遵循开闭原则
- 缺点 类数量激增(类爆炸问题)
3、抽象工厂模式
interface DessertFactory {Coffee createCoffee();Dessert createDessert();
}class AmericanDessertFactory implements DessertFactory {public Coffee createCoffee() { return new AmericanCoffee(); }public Dessert createDessert() { return new MatchaMousse(); }
}
- 优点 管理产品族(咖啡+甜点的组合)
- 代价 新增产品类型需修改所有工厂接口
4、模式对比表
模式特性 | 简单工厂 | 工厂方法 | 抽象工厂 |
---|---|---|---|
扩展性 | 修改工厂类 | 新增工厂子类 | 新增工厂实现类 |
产品维度 | 单一产品 | 单一产品 | 产品族(多相关产品) |
开闭原则 | 违反 | 遵循 | 部分遵循 |
复杂度 | 低 | 中 | 高 |
典型应用场景 | 简单对象创建 | 需要灵活扩展的产品创建 | 系列关联产品的组合创建 |
四、进阶应用技巧
1、静态工厂
class SimpleCoffeeFactory {public static Coffee createCoffee(String type) {// 创建逻辑...}
}
2、配置化工厂
# bean.properties
american=com.example.AmericanCoffee
latte=com.example.LatteCoffee
class ConfigFactory {private static Map<String, Coffee> cache = new HashMap<>();static {// 加载配置文件,反射创建对象存入缓存}public static Coffee getCoffee(String key) {return cache.get(key);}
}
全部代码
public class CoffeeFactory {// 加载配置文件, 获取配置文件中配置的全类名, 并创建该类的对象进行存储// 1.定义容器对象用来存储咖啡对象private static HashMap<String, Coffee> map = new HashMap<String, Coffee>();// 2.加载配置文件, 只需要加载一次static {// 2.1 创建proper.ties 对象Properties p = new Properties();// 2.2调用p对象中的load 方法进行配置文件的加载 获取字节码 -> 获取类加载器 -> 获取目标资源(返回inputStream)InputStream is = CoffeeFactory.class.getClassLoader().getResourceAsStream("bean.properties");try {// 加载资源p.load(is);// 从p集合中获取全类名并创建对象Set<Object> keys = p.keySet();for (Object key : keys) {String className = p.getProperty((String) key);// 通过反射创建对象Class<?> clazz = Class.forName(className);Coffee coffee = (Coffee) clazz.newInstance();// 创建对象// 将名称和对象存储到容器中map.put((String) key,coffee);}} catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException e) {e.printStackTrace();}}// 根据名称获取对象public static Coffee createCoffee(String name){return map.get(name);}
}
五、JDK典型案例
- 集合迭代器
// 工厂方法模式应用
Collection<String> coll = new ArrayList<>();
Iterator<String> it = coll.iterator(); // ArrayList内部实现Iterator
- 日期工具
Calendar cal = Calendar.getInstance(); // 根据时区返回不同实现
DateFormat df = DateFormat.getInstance();
2、文字提炼 - 记忆切入点
一、简单工厂模式
1、核心思想
将对象创建逻辑集中在一个"工厂类"中,通过 参数
控制具体产品类型。
-
关键步骤
-
定义产品接口
创建抽象基类(如Coffee
),声明所有产品共有的方法(如getName()
) -
实现具体产品
继承基类创建具体产品(如AmericanCoffee
和LatteCoffee
),各自实现特有逻辑 -
构建工厂类
创建SimpleCoffeeFactory
类,内部包含静态/实例方法(如createCoffee(type)
),通过if-else
或switch
判断参数类型,返回对应的具体产品实例 -
客户端调用
客户端(如CoffeeStore
)持有工厂引用,调用createCoffee()
时传入类型参数,无需直接接触具体产品类
-
-
典型特征
-
工厂类包含所有产品的创建逻辑
-
新增产品必须修改工厂类代码
-
二、工厂方法模式
2、核心思想
将对象的创建 延迟
到子类,每个产品对应一个专属工厂。
-
关键步骤
-
定义抽象工厂接口
创建CoffeeFactory
接口,声明抽象方法(如createCoffee()
) -
实现具体工厂
为每个产品创建专属工厂类(如AmericanCoffeeFactory
和LatteCoffeeFactory
),在createCoffee()
中返回对应的具体产品实例 -
客户端依赖抽象
客户端类(如CoffeeStore
)持有工厂接口的引用,通过setFactory()
方法注入具体工厂 -
动态创建产品
客户端调用factory.createCoffee()
时,实际执行的是具体工厂类中实现的创建逻辑
-
-
典型特征
-
每个产品对应一个独立工厂类
-
新增产品只需添加新工厂,无需修改已有代码
-
三、抽象工厂模式
2、核心思想
创建相关产品族的工厂,保证产品之间的兼容性。
-
关键步骤
-
定义产品族接口
创建多个抽象产品接口(如Coffee: 咖啡
和Dessert: 甜点
),每个接口代表一类产品 -
定义抽象工厂接口
创建DessertFactory: 甜点工厂
接口,声明创建系列产品的方法(如createCoffee()
和createDessert()
) -
实现具体工厂
为每个产品族创建工厂类(如AmericanDessertFactory: 美式甜点工厂
),同时实现该族内 所有产品的创建逻辑 -
客户端组合使用
客户端通过选择具体工厂,获得配套的产品组合(如美式咖啡 + 抹茶慕斯),确保产品间的兼容性
-
-
典型特征
-
一个工厂创建多个关联产品
-
新增产品类型时, 需要修改所有工厂接口
-
四、工厂模式历史演进
- 简单工厂 解决直接
new
对象带来的耦合问题,但工厂本身成为新的耦合点 - 工厂方法 通过多态工厂解耦,支持扩展但容易产生类爆炸
- 抽象工厂 应对产品组合需求,用更高维度的抽象管理关联对象
五、记忆点 - 关键区别
-
考虑创建目标时
简单工厂
单一产品工厂方法
单一产品抽象工厂
产品族
-
考虑扩展代价时
简单工厂
修改工厂类工厂方法
新增工厂类抽象工厂
修改所有工厂接口
-
考虑设计重心时
简单工厂
创建逻辑集中化工厂方法
创建责任分散化抽象工厂
产品组合约束
提炼
模式选择指南
- 简单工厂 适用于对象创建逻辑简单,不需要频繁扩展
- 工厂方法 适合需要灵活扩展产品类型的场景
- 抽象工厂 适用于管理产品族,强调相关产品必须配套使用
关键设计原则体现
- 开闭原则 工厂方法模式的典型体现
- 单一职责 每个工厂只负责创建特定对象
- 依赖倒置 客户端依赖抽象接口而非具体实现
如果这篇文章帮到你, 帮忙点个关注呗, 不想那那那点赞或收藏也行鸭 (。•̀ᴗ-)✧ ~
'(இ﹏இ`。)
相关文章:
设计模式 - 工厂模式 精准梳理精准记忆
1、代码片段 - 带入理解 一、核心模式分类 简单工厂模式(编程习惯,非 GoF 设计模式)工厂方法模式(GoF 创建型模式)抽象工厂模式(GoF 创建型模式) 二、演变过程:咖啡店案例 初始实现…...
WIFI ESP8266以及基础功能介绍
芯片一旦烧写了程序就不可以使用AT指令集,需要重新刷回AT指令库才可以使用 wifi的通信频段是2.4G免费频段。 AT指令 AT(attention)command set.AT指令集或命令集,一般称为AT指令 海斯命令集:Hayes command set 默认…...
面试java做了一道逻辑题,人麻了
题目:给你一个5升水壶,一个6升水壶,去池塘中取水,如何保证最后取出的水是3升? 思考了很久终于想出来了,这里用X5代表5升的桶,X6代表6升的桶: ① 6升桶装满,X50ÿ…...
go语言因为前端跨域导致无法访问到后端解决方案
前端服务8080访问后端8081这端口显示跨域了 ERROR Network Error AxiosError: Network Error at XMLHttpRequest.handleError (webpack-internal:///./node_modules/axios/lib/adapters/xhr.js:116:14) at Axios.request (webpack-internal:///./node_modules/axios/lib/core/A…...
svn删除所有隐藏.svn文件,文件夹脱离svn控制
新建一个文件,取名remove-svn-folders.reg,输入如下内容: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] "Delete SVN Folders" [HKEY_LOCAL_MACHINE\SOFTWARE\Class…...
Greenplum6.19集群搭建
一,安装说明 1.1环境说明 1、首先确定部署的环境,确定下服务器的端口,一般默认是22的端口; 2、当前这份文档是服务器处于10022端口下部署的(现场生产环境要求,22端口在生产环境存在安全隐患)&…...
C/C++蓝桥杯算法真题打卡(Day4)
一、P11041 [蓝桥杯 2024 省 Java B] 报数游戏 - 洛谷 算法代码: #include<bits/stdc.h> using namespace std;// 计算第 n 个满足条件的数 long long findNthNumber(long long n) {long long low 1, high 1e18; // 二分查找范围while (low < high) {lo…...
TinyWebServer项目笔记——01 线程同步机制封装类
目录 1.基础知识 (1)RALL (2)信号量 (3)互斥量 (4)条件变量 2.功能 1.基础知识 (1)RALL RALL全称“Resource Acquisition is Initialization”…...
如何在Ubuntu上直接编译Apache Doris
以下是在 Ubuntu 22.04 上直接编译 Apache Doris 的完整流程,综合多个版本和环境的最佳实践: 注意:Ubuntu的数据盘VMware默认是20G,编译不够用,给到50G以上吧 一、环境准备 1. 安装系统依赖 # 基础构建工具链 apt i…...
算法006——和为S 的两个数
力扣——查找总价格为目标值的两个商品点击跳转 注意题目中的关键信息升序 我们利用双指针,不管 target 是多少,让一个指针指向最小值,让一个指针指向最大 那么,共有三种情况 我们首先遇到的是第二种情况 sum < target left …...
物联网设备接入系统后如何查看硬件实时数据?
要在软件中实时查看硬件设备的信息,通常需要结合前后端技术来实现。以下是设计思路和实现步骤: 1. 系统架构设计 实时查看硬件设备信息的系统通常采用以下架构: 数据采集层: 硬件设备通过传感器采集数据,发送到InfluxDB。数据存…...
CSS—属性继承与预处理器:2分钟掌握预处理器
个人博客:haichenyi.com。感谢关注 1. 目录 1–目录2–属性继承3–预处理器 2. 属性继承 像Android里面继承extends,类继承,子类可以使用父类的public和protected的属性和方法。子类可以直接用。 在CSS里面也是类似的。CSS里面是布局里面…...
前端知识点---http.createHttp()的理解(arkts)
通俗易懂的例子:点外卖 🍔🥤 想象一下,你在家里点外卖,HTTP 请求就像是你和餐厅之间的沟通方式。 1️⃣ 没有 http.createHttp():每次点餐都重新拨电话 📞 如果你每次点餐都重新拨打餐厅的电话…...
信息安全访问控制、抗攻击技术、安全体系和评估(高软42)
系列文章目录 信息安全访问控制、抗攻击技术、安全体系和评估 文章目录 系列文章目录前言一、信息安全技术1.访问控制2.抗攻击技术 二、欺骗技术1.ARP欺骗2.DNS欺骗3.IP欺骗 三、抗攻击技术1.端口扫描2.强化TCP/IP堆栈 四、保证体系和评估1.保证体系2.安全风险管理 五、真题在…...
【深度学习】宠物品种分类Pet Breeds Classifier
文章目录 宠物品种数据集制作宠物品种标签图像预处理Presizing 损失函数loss观察模型的性能提升模型的性能learning rate finder使用CLR算法训练选择学习率的策略重新训练 迁移学习微调fine_tunefit_one_cycle有判别力的学习率 选择epoch的数量更深的网络架构 宠物品种数据集 …...
PyQt组件间的通信方式
PyQt组件间的通信方式 PyQt组件间的通信方式 1. 组件介绍 1.1 组件的定义1.2 组件的分类 2. 组件的通信方式 2.1 信号与槽(Signal & Slot) 1. 组件介绍 在 Qt 框架中,组件(Component)是构建图形用户界面&am…...
基于编译器特性浅析C++程序性能优化
最近在恶补计算机基础知识,学到CSAPP第五章的内容,在这里总结并且展开一下C程序性能优化相关的内容。 衡量程序性能的方式 一般而言,程序的性能可以用CPE(Cycles Per Element)来衡量,其指的是处理每个元素…...
在 Docker 中搭建GBase 8s主备集群环境
本文介绍了如何在同一台机器上使用 Docker 容器搭建GBase 8s主备集群环境。 拉取镜像 拉取GBase 8s的最新镜像 docker pull liaosnet/gbase8s或者docker pull liaosnet/gbase8s:v8.8_3513x25_csdk_x64注:在tag为v8.8_3513x25_csdk_x64及之后的版本中,…...
hadoop集群环境配置
目录 VMware虚拟机安装 Xshell安装 网络问题 centos7下载 ---------参考以下视频步骤进行生态搭建---------- 搭建好hadoop01 克隆出hadoop02、hadoop03 启动三台虚拟机 打开终端 输入 记录下各个ip 打开Xshell,新建会话 修改主机名 配置静态IP 主机名称…...
Hive-优化(参数优化篇)
map 数和reduce数 控制hive任务中的map数 合适的map数,会让资源分配的更平均,让我们的代码运行更快,通常情况下,作业会通过input的目录产生一个或者多个map任务。我们可以通过调整参数来控制运行过程中的map数。 Hive Map的数量…...
深度学习|MAE技术全景图:自监督学习的“掩码魔法“如何重塑AI基础
一、引言:深度学习的困境与自监督的曙光 深度学习(Deep Learning)无疑是当今人工智能领域基础中的基础。从图像识别到自然语言处理(NLP),它在无数任务中展现了卓越性能。例如,在安防监控中&…...
学习threejs,使用LineBasicMaterial基础线材质
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.LineBasicMaterial1.…...
第本章:go 切片
注意: 切片必须要初始化 才能使用 ,切片是引用类型 a :[]int{} // 这上叫始化 此时并没有申请内存 // 如果要追加值的话: append ints : append(a, 1, 2, 3)a : make([]int,5) // 声明切片类型var a []string //声明一…...
dify + ollama + deepseek-r1+ stable-diffusion 构建绘画智能体
故事背景 stable-diffusion 集成进 dify 后,我们搭建一个小智能体,验证下文生图功能 业务流程 #mermaid-svg-6nSwwp69eMizP6bt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6nSwwp69eMiz…...
Java基础面试题全集
1. Java语言基础 1.1 Java是什么? • Java是一种广泛使用的编程语言,最初由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。它是一种面向对象的、基于类的、通用型的编程语言,旨在让应用程序“编写一次&…...
基于multisim的自动干手器设计与仿真
1 设计的任务与要求 设计一个输出 5V 的直流稳压电源。用开关的闭合模拟手挡住光线的功能。用灯的亮灭模拟烘干吹风功能。 2 方案论证与选择 2.1 自动干手器的系统方案 本设计由5V直流电源、红外发射电路、红外接收电路、灯模拟电路构成。 1. 5V直流电源系统 这一部分是整…...
three.js 在 webGL 添加纹理
在我们生成了3D设计之后,我们可以添加纹理使其更加吸引人。在 webGL 和 p5.js中,可以使用 gl.texImage2D() 和 texture() API来为形状应用纹理。 使用 webGL 在 webGL 中,gl.texImage2D() 函数用于从图像文件生成2D纹理。该函数接受许多参…...
Docker 部署 MongoDB 并持久化数据
Docker 部署 MongoDB 并持久化数据 在现代开发中,MongoDB 作为 NoSQL 数据库广泛应用,而 Docker 则提供了高效的容器化方案。本教程将介绍如何使用 Docker 快速部署 MongoDB,并实现数据持久化,确保数据不会因容器重启或删除而丢失…...
SpringBoot优雅关机,监听关机事件,docker配置
Spring Boot 提供了多种方法来实现优雅停机(Graceful Shutdown),这意味着在关闭应用程序之前,它会等待当前正在处理的请求完成,并且不再接受新的请求。 一、优雅停机的基本概念 优雅停机的主要步骤如下: …...
网络基础(一)【网络发展/认识协议/网络 VS 系统/以太网通信原理/重谈协议/网络中的地址管理】
网络基础(一) 1. 网络的发展2. 认识协议3. 网络 VS 系统4. 以太网通信原理5. 重谈协议6. 网络中的地址管理 1. 网络的发展 最开始时,计算机之间相互独立。 但是为了协作完成一些任务,就产生了计算机之间相互通讯的需求,…...
PostgreSQL、SQL Server和MySQL数据库性能调优与故障排除技术
通过结合具体技术特性与工具链的深度使用,可系统化提升数据库性能和稳定性。建议根据实际负载特征制定监控-分析-优化的闭环管理流程。 数据库技术: PostgreSQL 13:逻辑复制、分区表、并行查询、监控工具(如pg_stat_statements、…...
本地YARN集群部署
请先完成HDFS的前置部署,部署方式可查看:本地部署HDFS集群https://blog.csdn.net/m0_73641796/article/details/145998092?spm1001.2014.3001.5502 部署说明 组件配置文件启动进程备注Hadoop HDFS需修改 需启动: NameNode作为主节点 DataNode作为从节点 Secondary…...
Redis数据结构——list
目录 列表命令 lpush lrange lpushx rpush rpushx lpop rpop lindex linsert llen lrem ltrim lset blpop / brpop 命令总结 编码方式 list相当于数组或者顺序表,但并不是简单的数组,更接近于C中的"双端队列"(deque)。 最左侧的下标…...
World of Warcraft [CLASSIC] BigFoot BiaoGe
World of Warcraft [CLASSIC] BigFoot BiaoGe 金团表格插件 设置60秒拍卖装备时间 ALT 鼠标左键,点击装备,弹出对话框,填写 1)拍卖时间默认60秒,起拍价, 2)点击【开始拍卖】 团队所有安装了…...
CentOS Docker 安装指南
CentOS Docker 安装指南 引言 Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及应用的依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker 容器是完全使用沙箱机制,相互之…...
PHP:phpstudy无法启动MySQL服务问题解决
文章目录 一、问题说明二、解决问题 一、问题说明 我的Windows10系统,之前安装过MySQL5.7的版本。 然后,用phpstudy安装MySQL8,并启动MySQL8。 发生无法启动的情况。 二、解决问题 1、删除本地MySQL7的服务 net stop MySQL //这里的服务名…...
【电控笔记z29】扰动估测器DOB估测惯量J-摩擦系数B
基本原理 扰动估测器的核心思想是通过向电机系统施加特定的扰动信号,观察系统响应的变化,然后利用系统的动态模型和控制理论来估计未知参数,如惯量和摩擦系数 。一般基于电机的运动方程建立数学模型,结合观测到的电机实际运行数据…...
STM32-I2C通信外设
目录 一:I2C外设简介 二:I2C外设数据收发 三:I2C的复用端口 四:主机发送和接收 五:硬件I2C读写MPU6050 相关函数: 1.I2C_ GenerateSTART 2.I2C_ GenerateSTOP 3.I2C_ AcknowledgeConfig 4.I2C…...
计算机二级MS之PPT
声明:跟着大猫和小黑学习随便记下一些笔记供大家参考,二级考试之前将持续更新,希望大家二级都能轻轻松松过啦,过了二级的大神也可以在评论区留言给点建议,感谢大家!! 文章目录 考题难点1cm25px…...
Spring Boot 3 整合 MinIO 实现分布式文件存储
引言 文件存储已成为一个做任何应用都不可回避的需求。传统的单机文件存储方案在面对大规模数据和高并发访问时往往力不从心,而分布式文件存储系统则提供了更好的解决方案。本篇文章我将基于Spring Boot 3 为大家讲解如何基于MinIO来实现分布式文件存储。 分布式存…...
C++ Primer 交换操作
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
分布式中间件:Redis介绍
目录 Redis 概述 Redis 的特点 高性能 丰富的数据结构 持久化 分布式特性 简单易用 Redis 的数据结构 字符串(String) 哈希(Hash) 列表(List) 集合(Set) 有序集合&…...
软件测试的基础入门(二)
文章目录 一、软件(开发)的生命周期什么是生命周期软件(开发)的生命周期需求分析计划设计编码测试运行维护 二、常见的开发模型瀑布模型流程优点缺点适应的场景 螺旋模型流程优点缺点适应的场景 增量模型和迭代模型流程适应的场景…...
学之思社区版考试系统docker-compose部署
参考 开源项目-Docker部署学之思管理系统 安装docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Bas…...
深度优先搜索(DFS)和广度优先搜索(BFS)——c#实现
一、深度优先搜索(DFS) 原理: 沿着分支尽可能深入,直到到达叶子节点,然后回溯探索其他分支 类似走迷宫时优先选择一条路走到黑,碰壁再回退 数据结构:栈(Stack)或递归实…...
什么是hive
Apache Hive 是一个基于 Hadoop 生态系统构建的数据仓库工具,主要用于处理和分析大规模的结构化数据。它允许用户通过类似 SQL 的查询语言(HiveQL)进行数据操作,而无需直接编写复杂的 MapReduce 程序。以下是 Hive 的核心特点和应…...
JVM详解
目录 一.JVM的概念 1. 什么是JVM? 2.JVM用来干什么? 二JVM运行流程 JVM执⾏流程 2.1类加载机制 2.2类加载机制带来了哪些好处? 2.3类加载的过程是什么? 2.3.1加载 2.3.2验证 2.3.3准备阶段 2.3.4解析阶段 符号引⽤ 直接引⽤ 2.3.5初始化阶段 2.4类加载器 什么…...
PCA(主成分分析)核心原理
一、PCA(主成分分析)核心原理 即主成分分析技术,又称主分量分析技术,旨在利用降维的思想,把多指标转化为少数几个综合指标。在统计学中,主成分分析PCA是一种简化数据集的技术。它是一个线性变换。这个变换…...
DeepSeek私有化部署6:openEuler 24.03-LTS-SP1安装Open WebUI
Open WebUI是一个 Open WebUI 是一个可扩展的、功能丰富、用户友好的自托管 AI 平台,专为完全离线运行而设计。 它支持多种 LLM 运行环境,包括 Ollama 和 OpenAI 兼容的 API,并内置了用于 RAG 的推理引擎,是一个强大的 AI 部署解决…...
【一文学会 HTML5】
目录 HTML概述基本概念HTML 发展历程HTML 基本结构 网页基本标签标题标签(<h1> - <h6>)段落标签(<p>)换行标签(<br>)水平线标签(<hr>)注释࿰…...