创建型设计模式之:简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式
创建型设计模式之:简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式
(一)简单工厂模式
简单工厂模式将对象的实例化过程封装到一个工厂类中,根据输入的条件创建不同类型的对象。
- 角色划分:
- 抽象产品:定义产品的接口
- 具体产品:实现具体的功能
- 工厂类:定义一个静态的工厂方法,负责根据条件创建产品
我们以支付方式为例实现一个简单工厂模式。
// 支付接口(抽象产品)
public interface Payment {void pay(double amount);
}// 支付宝支付(具体产品)
public class Alipay implements Payment {@Overridepublic void pay(double amount) {System.out.println("使用支付宝支付:" + amount + "元");}
}// 微信支付(具体产品)
public class WechatPay implements Payment {@Overridepublic void pay(double amount) {System.out.println("使用微信支付:" + amount + "元");}
}// 支付工厂(负责创建具体产品)
public class PaymentFactory {// 工厂方法,根据条件创建产品public static Payment createPayment(String type) {if ("alipay".equalsIgnoreCase(type)) {return new Alipay();} else if ("wechat".equalsIgnoreCase(type)) {return new WechatPay();} else {throw new IllegalArgumentException("不支持的支付类型");}}
}// 客户端
public class Client {public static void main(String[] args) {// 通过工厂创建支付对象,面向接口而不是具体实现编程Payment alipay = PaymentFactory.createPayment("alipay");alipay.pay(100.0); // 输出:使用支付宝支付:100.0元Payment wechatPay = PaymentFactory.createPayment("wechat");wechatPay.pay(200.0); // 输出:使用微信支付:200.0元}
}
-
优点:
- 解耦:将对象的创建与使用分离,客户端不需要关心具体实现类
- 集中管理:新增或修改产品时只需要调整工厂类
-
缺点:
- 违反开闭原则:新增或修改产品类需要调整工厂类代码的 if-else 分支
(二)工厂方法模式
工厂方法模式定义工厂接口(声明工厂方法即创建产品的方法)并为每一种具体产品都实现工厂类,将对象的创建过程延迟到子类进行。
- 角色划分:
- 抽象产品:定义产品的接口
- 具体产品:实现具体的功能
- 抽象工厂:工厂类的抽象层,声明工厂方法但不实现具体逻辑
- 具体工厂:为每种具体产品实现一个工厂类,实现工厂方法
我们还是沿用前面的支付方式实现工厂方法模式:
// 支付接口(抽象产品)
public interface Payment {void pay(double amount);
}// 支付宝支付(具体产品)
public class Alipay implements Payment {@Overridepublic void pay(double amount) {System.out.println("使用支付宝支付:" + amount + "元");}
}// 微信支付(具体产品)
public class WechatPay implements Payment {@Overridepublic void pay(double amount) {System.out.println("使用微信支付:" + amount + "元");}
}// 抽象工厂(只负责声明抽象方法,但不做具体实现)
public interface PaymentFactory {Payment createPayment();
}// 支付宝支付工厂(具体工厂)
public class AlipayFactory implements PaymentFactory {@Overridepublic Payment createPayment() {return new Alipay();}
}// 微信支付工厂(具体工厂)
public class WechatPayFactory implements PaymentFactory {@Overridepublic Payment createPayment() {return new WechatPay();}
}// 客户端
public class Client {public static void main(String[] args) {// 如需增加支付方式,只需要增加对应的具体产品类和具体工厂类,直接修改客户端即可,符合开闭原则PaymentFactory paymentFactory = new AlipayFactory();Payment payment = paymentFactory.createPayment();payment.pay(100.0); // 输出:使用支付宝支付:100.0元}
}
-
优点:
-
符合开闭原则:如需增加产品类型,只需要增加对应的具体产品类和具体工厂类
-
解耦:客户端只需要依赖抽象工厂和抽象产品,不需要关心具体实现
-
-
缺点:
- 类数量增加:每个产品都对应一个工厂类,导致系统规模膨胀
(三)抽象工厂模式
抽象工厂模式并不像工厂方法模式那样,为每一个产品实现具体工厂类,而是为每一个产品族实现具体工厂类,称为平台工厂。
-
产品体系结构和产品族:
-
产品体系结构是同一类产品的不同实现
- 例如:支付接口,以及下面的微信支付、支付宝支付等实现,构成了支付产品体系结构
-
产品族是同一平台下的不同产品
- 例如:微信平台,以及下面的微信支付、微信贷款等产品,构成了微信产品族
-
-
角色划分:
- 抽象产品:定义产品的接口
- 具体产品:实现具体的功能
- 抽象平台工厂:声明抽象平台下的产品族的工厂方法
- 具体平台工厂:实现具体平台下的产品族的工厂方法
// 支付接口
public interface Payment {void pay(double amount);
}// 微信支付
public class WechatPayment implements Payment {@Overridepublic void pay(double amount) {System.out.println("微信支付:" + amount + "元");}
}// 支付宝支付
public class AlipayPayment implements Payment {@Overridepublic void pay(double amount) {System.out.println("支付宝支付:" + amount + "元");}
}// 贷款接口
public interface Loan {void apply(double amount);
}// 微信贷款
public class WechatLoan implements Loan {@Overridepublic void apply(double amount) {System.out.println("微信贷款申请:" + amount + "元");}
}// 支付宝贷款
public class AlipayLoan implements Loan {@Overridepublic void apply(double amount) {System.out.println("支付宝贷款申请:" + amount + "元");}
}// 抽象平台工厂,负责创建平台下的一族产品(包括支付产品与贷款产品)
public interface PlatformFactory {Payment createPayment();Loan createLoan();
}// 微信平台工厂
public class WechatFactory implements PlatformFactory {@Overridepublic Payment createPayment() {return new WechatPayment();}@Overridepublic Loan createLoan() {return new WechatLoan();}
}// 支付宝平台工厂
public class AlipayFactory implements PlatformFactory {@Overridepublic Payment createPayment() {return new AlipayPayment();}@Overridepublic Loan createLoan() {return new AlipayLoan();}
}// 客户端
public class Client {public static void main(String[] args) {PlatformFactory platformFactory = new WechatFactory();Payment payment = platformFactory.createPayment();Loan loan = platformFactory.createLoan();payment.pay(100.0);loan.apply(100.0);}
}
- 开闭原则的倾斜性:
- 新增产品族,只需要增加对应的具体产品和平台工厂类,不需要改动原有代码,符合开闭原则
- 新增产品体系结构,需要修改抽象平台工厂和所有的具体平台工厂实现,不符合开闭原则
(四)建造者模式
建造者模式主要用于分步骤构建复杂对象,分离构造过程和表示,并通过链式调用增强可读性,避免客户端构造器参数爆炸。
- 角色划分:
- 目标类:私有化构造器,确保只能通过建造者类创建对象,并通过
builder()
方法提供建造者的访问入口 - 建造者类:目标类的静态内部类,私有化构造器,通过链式方法设置可选参数,并通过
build()
方法最终调用目标类私有构造器生成对象
- 目标类:私有化构造器,确保只能通过建造者类创建对象,并通过
我们来看如何使用建造者模式构建一个计算机对象:
public class Computer {// 计算机类的属性private String cpu;private String ram;private String hardDisk;private String screen;// 私有化构造器,并通过传入建造者创建对象,这个构造器将会在建造者的 build() 方法中被调用private Computer(Builder builder) {this.cpu = builder.cpu;this.ram = builder.ram;this.hardDisk = builder.hardDisk;this.screen = builder.screen;}// 提供建造者的访问入口public static Builder builder() {return new Builder();}// 业务方法public void show() {System.out.println("cpu: " + cpu);System.out.println("ram: " + ram);System.out.println("hardDisk: " + hardDisk);System.out.println("screen: " + screen);}// 静态内部建造者类,负责通过链式方法构建目标对象public static class Builder {private String cpu;private String ram;private String hardDisk;private String screen;// 私有化构造器,这个构造器将会在目标类的 builder() 方法中被调用private Builder() {}// 通过一系列链式方法设置目标对象的属性,这些方法都会返回构造器对象,用于最后调用 build() 方法public Builder cpu(String cpu) {this.cpu = cpu;return this;}public Builder ram(String ram) {this.ram = ram;return this;}public Builder hardDisk(String hardDisk) {this.hardDisk = hardDisk;return this;}public Builder screen(String screen) {this.screen = screen;return this;}// 返回目标对象public Computer build() {return new Computer(this);}}
}public class Client {public static void main(String[] args) {Computer computer = Computer.builder() // Builder.cpu("i7") // Builder.ram("16G") // Builder.hardDisk("512G") // Builder.screen("15.6") // Builder.build(); // Computercomputer.show();}
}
(五)原型模式
原型模式通过复制现有对象(原型)生成新对象,而非通过构造函数初始化。
- 浅拷贝与深拷贝:
- 浅拷贝:复制对象的值类型字段,引用类型字段共享同一内存地址(默认的
Object.clone()
实现) - 深拷贝:递归复制对象的所有字段(包括引用对象),完全独立于原对象,可以通过序列化和反序列化实现
- 浅拷贝:复制对象的值类型字段,引用类型字段共享同一内存地址(默认的
- 角色划分:
- 抽象原型:定义原型公有属性和方法,声明抽象方法,并实现
Cloneable
接口,实现浅拷贝或深拷贝逻辑 - 具体原型:定义具体原型,实现抽象方法
- 原型管理器:负责通过原型注册表管理原型,并克隆出新对象
- 抽象原型:定义原型公有属性和方法,声明抽象方法,并实现
假设游戏中需要快速生成大量相似的敌人,但每个敌人的初始状态(位置、装备)可能不同:
// 抽象原型接口(实现 Cloneable)
public abstract class Enemy implements Cloneable {protected String type;protected int x;protected int y;protected List<String> equipment; // 引用类型字段(测试深拷贝)public abstract void attack();// 实现浅拷贝(默认)@Overridepublic Enemy clone() {try {return (Enemy) super.clone();} catch (CloneNotSupportedException e) {throw new RuntimeException("克隆失败", e);}}// 深拷贝实现(需手动重写)public Enemy deepClone() {Enemy cloned = this.clone();cloned.equipment = new ArrayList<>(this.equipment); // 深拷贝引用字段return cloned;}// Setters & Getterspublic void setPosition(int x, int y) {this.x = x;this.y = y;}public void addEquipment(String item) {this.equipment.add(item);}
}// 具体原型:普通敌人
public class NormalEnemy extends Enemy {public NormalEnemy() {type = "普通敌人";equipment = new ArrayList<>(List.of("短剑")); // 默认装备}@Overridepublic void attack() {System.out.printf("[%s] 在位置(%d, %d) 发动攻击,装备:%s\n", type, x, y, equipment);}
}// 具体原型:Boss敌人
public class BossEnemy extends Enemy {public BossEnemy() {type = "Boss";equipment = new ArrayList<>(List.of("巨斧", "重甲"));}@Overridepublic void attack() {System.out.printf("[%s] 在位置(%d, %d) 释放技能,装备:%s\n", type, x, y, equipment);}
}import java.util.HashMap;
import java.util.Map;public class EnemyRegistry {private static Map<String, Enemy> prototypes = new HashMap<>();static {// 预注册原型prototypes.put("normal", new NormalEnemy());prototypes.put("boss", new BossEnemy());}// 获取克隆对象public static Enemy getEnemy(String type) {Enemy prototype = prototypes.get(type);if (prototype == null) {throw new IllegalArgumentException("未知敌人类型");}return prototype.deepClone(); // 深拷贝返回}// 动态添加原型public static void addPrototype(String key, Enemy enemy) {prototypes.put(key, enemy);}
}// 客户端
public class GameClient {public static void main(String[] args) {// 从注册表克隆敌人Enemy enemy1 = EnemyRegistry.getEnemy("normal");enemy1.setPosition(10, 20);enemy1.addEquipment("盾牌"); // 修改克隆体的装备enemy1.attack(); // 输出:[普通敌人] 在位置(10, 20) 发动攻击,装备:[短剑, 盾牌]Enemy enemy2 = EnemyRegistry.getEnemy("boss");enemy2.setPosition(50, 30);enemy2.attack(); // 输出:[Boss] 在位置(50, 30) 释放技能,装备:[巨斧, 重甲]}
}
相关文章:
创建型设计模式之:简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式
创建型设计模式之:简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式 (一)简单工厂模式 简单工厂模式将对象的实例化过程封装到一个工厂类中,根据输入的条件创建不同类型的对象。 角色划分: 抽象产品…...
【Linux内核设计与实现】第三章——进程管理01
文章目录 1. 引言2. 进程&线程——概念3. 进程控制块/进程描述符(PCB)4. 进程内核栈(Kernel Stack)4.1. 进程内核栈的定义4.2. thread_info 体系结构相关进程描述4.3. 定位进程描述符(task_struct)和内核栈以及内核栈指针的问题 5. 进程 IDÿ…...
正大模型视角下的市场结构判断逻辑
正大模型视角下的市场结构判断逻辑 在多数交易策略中,结构识别往往先于方向判断。以正大的数据研判风格为例,其核心逻辑是:价格行为不能孤立解读,必须结合时间与成交效率来判断当前结构的有效性。 例如,一个上涨过程&…...
4.25学习——文件上传之00截断
继昨天学习的基础文件上传内容,进一步学习文件上传的绕过方式 00截断绕过 原理:00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以\0(即0x00)作…...
黑马Redis(三)黑马点评项目
优惠卷秒杀 一、全局唯一ID 基于Redis实现全局唯一ID的策略: Component RequiredArgsConstructor public class RedisIdWorker {private static final Long BEGIN_TIMESTAMP1713916800L;private static final int COUNT_BITS 32;Resourceprivate final StringRed…...
dedecms织梦arclist标签noflag属性过滤多个参数
织梦dedecms系统arclist标签noflag属性默认是只能过滤一个参数,比如过滤推荐是noflagc,过滤有图片的文章是noflagc,在模板制作过程中,有时候我们为了seo和避免重复,需要过滤多个参数。今天小编就来跟大家讲讲织梦dedec…...
Jira、PingCode、Redmine等18款缺陷管理工具对比评测
本文主要介绍了以下:1. PingCode; 2. Worktile; 3. Jira; 4. Bugzilla; 5. TAPD; 6. 码云; 7. Redmine; 8. Trac; 9. 蓝鲸智云; 10. 阿里云效等等18款缺陷管理工具。 在现代软件开发和项目管理中,缺陷管理工具扮演着至关重要的角色。随着企业对软件质量的…...
京东以图搜图(拍立淘)API接口返回参数详解
京东以图搜图(拍立淘)API接口的返回参数通常以结构化JSON格式呈现,涵盖商品基础信息、相似度评分、库存状态及扩展字段,以下为关键参数详解及使用建议: 一、核心返回参数解析 状态标识类 status:请求状态…...
LSTM+KNN - 多元数据异常检测 !
大家好!我是我不是小 upper~ 今天想和大家分享一个超实用的案例:如何通过 LSTM 与 KNN 实现多元数据异常检测。 想象一下,在工厂的智能化监控场景中,各类传感器实时采集着温度、湿度、压力等海量数据。我们的目标,就是从中精准识别出设备潜在故障等异常情况。 LSTM 作为时…...
OpenHarmony之电源管理子系统公共事件定义
OpenHarmony之电源管理子系统公共事件定义 电源管理子系统面向应用发布如下系统公共事件,应用如需订阅系统公共事件,请参考公共事件接口文档。 COMMON_EVENT_BATTERY_CHANGED 表示电池充电状态、电平和其他信息发生变化的公共事件的动作。 值&#x…...
angular 实现可编辑可选择复制的表格
这个实现的核心就是ag-grid 当然有类似的库就不必多说,React, Vue和纯h5类似。简单贴一下代码 1.首先是h5部分,就一个id为supply-chain-material-grid-table的div,记住要设置高度 <div class"dki-supply-chain-page-body">…...
组织用户数统计实现
# 完整的组织用户数统计实现 完整的组织用户数统计实现,包括模拟SQL查询、完整的Java代码实现以及详细解释。 ## 1. 模拟SQL查询 假设我们有一个组织表(organization)和用户表(user),以下是模拟查询SQL: sql -- 获取各组织及其用户数量&a…...
天机学堂day10作业,完善兑换优惠券功能
UserCouponServiceImpl /*** 兑换码兑换优惠券* param code*/TransactionalOverridepublic void exchangeCoupon(String code) {//1、校验code是否为空if (StringUtils.isBlank(code)) {throw new BadRequestException("非法参数!");}//2、解析兑换码&…...
Python编程的真谛:超越语法,理解编程本质
你是否也曾陷入这样的误区:学了无数的 Python 语法、刷了几十套题,写起代码却仍然卡顿、举步维艰?这时候你才发现,真正阻碍进步的,从不是语法,而是你对“编程本质”的理解。 如果你只是死记硬背Python的语…...
C语言 函数补充
目录 static和extern函数 1.static和extern函数 static和extern都是C语言中的关键字 static 是 静态的 的意思,可以用来: - 修饰局部变量- 修饰全局变量- 修饰函数 extern 是用来声明外部符号的。 在讲解 static 和 extern 之前再讲一下: 作用域和生命周期。 …...
【AI图像创作变现】04实操路径—插图/绘本/创意图集
引言 如果说头像是“一个角色的起点”,那么插图、绘本和图集就是“这个角色能走多远”。相比于头像这种单图任务,插图类创作更强调批量性、叙事性与风格统一性,它既可以承载故事,也可以构成一套完整的内容产品结构。 这类任务特…...
Lesar: 面向 Lustre/Scade 语言的形式化模型检查工具
在《同步反应式系统》的第一课中,介绍了同步数据流语言 Lustre 生态中的形式化模型检查器 Lesar 的用法。Lesar 可对 lustre v4 语言以及 Scade 语言中部分数据流核心特性进行模型检查。 Lesar 介绍 Lesar 是 Verimag 研发维护的形式化方法模型检查工具。该工具的理…...
告别 “幻觉” 回答:RAG 中知识库与生成模型的 7 种对齐策略
一、引言 大语言模型(LLM)在文本生成领域展现出惊人能力,但 “幻觉” 问题(生成虚构或偏离事实的内容)始终是落地应用的核心挑战。检索增强生成(RAG)通过将外部知识库与 LLM 结合,形…...
【Web应用服务器_Tomcat】一、Tomcat基础与核心功能详解
在 Java Web 应用开发领域,Apache Tomcat 是一座不可或缺的基石。作为一款开源、轻量级的 Servlet 容器和 Web 服务器,Tomcat 以其稳定可靠、易于部署和高度可定制性,被广泛应用于各类 Web 应用的部署与运行。 一、Tomcat 简介 Tomcat 是…...
Cesium实现地形可视域分析
Cesium实现可视化分析 一、地形可视域主要实现技术(Ray + 地形碰撞检测) Cesium 本身的 Ray 类可以用来执行非常精确的射线检测,我们可以结合地形高度(sample)来逐点检测光线是否与 terrain 相交,从而判断是否可见。 1.1 优势 实时判断每条射线是否被 terrain 遮挡地形…...
Java—— 常见API介绍 第五期
JDK8以后新增的时间相关类 Date类ZoneId:时区Instant:时间戳ZoneDateTime:带时区的时间 日期格式化类 SimpleDateFormat DateTimeFormatter:用于时间的格式化和解析 日历类 Calendar LocalDate:年、月、日LocalTime…...
ViewPager FragmentPagerAdapter在系统杀死应用后重建时UI不刷新的问题
解决方案 通过重写getItemId方法,返回Fragment的hashCode: Override public long getItemId(int position) {/*** 恢复状态重建时,新的 Fragment 不刷新UI。* 原因:instantiateItem 中通过 mFragmentManager.findFragmentByTag(…...
第3讲、大模型如何理解和表示单词:词嵌入向量原理详解
1. 引言 大型语言模型(Large Language Models,简称LLM)如GPT-4、Claude和LLaMA等近年来取得了突破性进展,能够生成流畅自然的文本、回答复杂问题、甚至编写代码。但这些模型究竟是如何理解人类语言的?它们如何表示和处…...
关于STM32f1新建工程
创建文件夹 首先创建一个存放工程的文件夹,建议建立在D,E盘 新建工程 在kiel5里面 找到刚刚建立的文件夹,然后在此文件夹里面新建一个文件夹用来存放本次工程,文件夹可以根据工程内容所编写,然后给自己工程也就是…...
Linux:进程间通信---匿名管道
文章目录 1. 进程间通信1.1 什么是进程间通信?1.2 为什么进程要进行进程间通信?1.3 怎么实现进程间通信? 2. 匿名管道2.1 匿名管道的原理2.2 匿名管道的系统接口2.3 匿名管道的使用2.4 匿名管道的运用场景 序:在上一篇文章中我们知…...
python代做推荐系统深度学习知识图谱c#代码代编神经网络算法创新
以下是针对推荐系统、深度学习、知识图谱和神经网络算法创新的代码框架及开发建议,适用于C#和Python的跨语言协作项目。以下内容分为几个部分,涵盖技术选型、代码示例和创新方向。 1. 推荐系统(Python C#) Python部分࿰…...
【动手学大模型开发】VSCode 连接远程服务器
Visual Studio Code(VSCode)是一款由微软开发的免费、开源的现代化代码编辑器。它以其轻量级、高性能和广泛的编程语言支持而受到开发者的青睐。VSCode 的核心特点包括: 跨平台:支持 Windows、macOS 和 Linux 操作系统。扩展市场…...
PostgreSQL 漏洞信息详解
PostgreSQL 漏洞信息详解 PostgreSQL 作为一款开源关系型数据库,其安全漏洞会被社区及时发现和修复。以下是 PostgreSQL 漏洞相关的重要信息和资源。 一、主要漏洞信息来源 1. 官方安全公告 PostgreSQL 安全信息页面:https://www.postgresql.org/sup…...
华为L410上制作内网镜像模板:在客户端配置模板内容
华为L410上制作内网镜像模板:在客户端配置模板内容 在本教程中,我们将继续在华为L410上配置内网镜像模板,具体介绍如何在客户端设置以便于在首次开机时自动安装软件。我们将主要使用WeChat作为示例。 1. 制作镜像模板,开启 rc.l…...
分布式队列对消息语义的处理
在分布式系统中,消息的处理语义(Message Processing Semantics)是确保系统可靠性和一致性的关键。有三种语义: 在分布式系统中,消息的处理语义(Message Processing Semantics)是确保系统可靠性和…...
《免费开放”双刃剑:字节跳动Coze如何撬动AI生态霸权与暗涌危机?》
战略动机分析 降低技术门槛为数据采集接口 Coze平台宣称**“30秒无代码生成AI Bot”,大幅降低了企业开发AI应用的技术门槛。任何不懂编程的业务人员都可以通过可视化流程和提示词,在半分钟内搭建聊天机器人或智能代理。这种极低门槛意味着更多企业和个人…...
AI 开发工具提示词集体开源!解锁 Cursor、Cline、Windsurf 等工具的核心逻辑
✨ 前言:提示词,AI 编程工具的灵魂 随着大模型编程能力的迅速提升,AI 编程工具如雨后春笋般涌现,涵盖了从代码编辑器(如 Cursor、Windsurf、Cline)到应用生成服务(如 Lovable、Bolt.new、V0&am…...
MYSQL 常用字符串函数 和 时间函数详解
一、字符串函数 1、CONCAT(str1, str2, …) 拼接多个字符串。 SELECT CONCAT(Hello, , World); -- 输出 Hello World2、SUBSTRING(str, start, length) 或 SUBSTR() 截取字符串。 SELECT SUBSTRING(MySQL, 3, 2); -- 输出 SQ3、LENGTH(str) 与 CHAR_LENGTH…...
Ubuntu 下 Nginx 1.28.0 源码编译安装与 systemd 管理全流程指南
一、环境与依赖准备 为确保编译顺利,我们首先更新系统并安装必要的编译工具和库: sudo apt update sudo apt install -y build-essential \libpcre3 libpcre3-dev \zlib1g zlib1g-dev \libssl-dev \wgetbuild-essential:提供 gcc、make 等基…...
线程怎么创建?Java 四种方式一网打尽
🚀 Java 中线程的 4 种创建方式详解 创建方式实现方式是否推荐场景说明1. 继承 Thread 类class MyThread extends Thread❌ 不推荐简单学习、单线程场景2. 实现 Runnable 接口class MyRunnable implements Runnable✅ 推荐更适合多线程共享资源3. 实现 Callable 接…...
高效使用DeepSeek对“情境+ 对象 +问题“型课题进行开题!
目录 思路"情境 对象 问题"型 课题选题的类型有哪些呢?这要从课题题目的构成说起。通过对历年来国家社会科学基金立项项目进行分析,小编发现,课题选题类型非常丰富,但一般是围绕限定词、研究对象和研究问题进行不同的组…...
【GCC bug】libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found
在 conda 环境安装 gcc/gxx 之后,运行开始遇到了以下的报错 File "/mnt/data/home/xxxx/miniforge3/envs/GAGAvatar/lib/python3.12/site-packages/google/protobuf/internal/wire_format.py", line 13, in <module>from google.protobuf import de…...
python卸载报错:No Python 3.12 installation was detected已解决
问题背景 在卸载Python 3.12.5时,遇到了一个棘手的问题:运行安装包python.exe点击Uninstall后,系统提示No Python 3.12 installation was detected. 尝试了网上各种方法(包括注册表清理、修复repair,卸载unins…...
【Hive入门】Hive分区与分区表完全指南:从原理到企业级实践
引言 在大数据时代,高效管理海量数据成为企业面临的核心挑战。Hive作为Hadoop生态系统中最受欢迎的数据仓库解决方案,其分区技术是优化数据查询和管理的关键手段。本文将全面解析Hive分区技术的原理、实现方式及企业级最佳实践,帮助您构建高性…...
AI之FastAPI+ollama调用嵌入模型OllamaBgeEmbeddings
以下是对该 FastAPI 代码的逐行解析和详细说明: 代码结构概览 from fastapi import Depends # 导入依赖注入模块def get_embedder():return OllamaBgeEmbeddings(base_url="http://ollama-cluster:11434",timeout=30,max_retries=5)@app.post("/embed")…...
RK3588芯片NPU的使用:yolov8-pose例子图片检测在安卓系统部署与源码深度解析(rknn api)
一、本文的目标 将yolo8-pose例子适配安卓端,提供选择图片后进行姿态识别功能。通过项目学习源码和rknn api。二、开发环境说明 主机系统:Windows 11目标设备:搭载RK3588芯片的安卓开发板核心工具:Android Studio Koala | 2024.1.1 Patch 2,NDK 27.0三、适配(迁移)安卓 …...
【HTTP/3:互联网通信的量子飞跃】
HTTP/3:互联网通信的量子飞跃 如果说HTTP/1.1是乡村公路,HTTP/2是现代高速公路系统,那么HTTP/3就像是一种革命性的"传送门"技术,它彻底重写了数据传输的底层规则,让信息几乎可以瞬间抵达目的地,…...
2024 年:Kubernetes 包管理的新前沿
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:历代文学,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计…...
SIEMENS PLC 程序 GRAPH 程序解读 车型入库
1、程序载图1 2、程序截图2 3、程序解释 这是一个基于西门子 GRAPH 编程的车型 1 入库顺序控制流程图,通过状态机结构(状态框 S 与转移条件 T)描述完整工作流程,具体如下: 整体流程概述 初始化:从 S1&am…...
c++11新特性随笔
1.统一初始化特性 c98中不支持花括号进行初始化,编译时会报错,在11当中初始化可以通过{}括号进行统一初始化。 c98编译报错 c11: #include <iostream> #include <set> #include <string> #include <vector>int main() {std:…...
微信小程序文章管理系统开发实现
概述 在内容为王的互联网时代,高效的文章管理系统成为各类平台的刚需。幽络源平台今日分享一款基于SSM框架开发的微信小程序文章管理系统完整解决方案,该系统实现了多角色内容管理、智能分类、互动交流等功能。 主要内容 一、用户端功能模块 多角…...
3种FSC标签你用对了吗?
如果你留意过产品上的FSC小树标识,也许会发现它们很相似但又各不相同。 根据产品使用的FSC认证材料的不同比例,共有三种不同类型的FSC标签: 1、FSC 100% 所有使用的材料均来自负责任管理的FSC认证森林。 标签文本为:“ From well-…...
NLP高频面试题(五十四)——深度学习归一化详解
引言:大模型训练中的归一化需求 随着人工智能技术的快速发展,**大模型(Large Language Models, LLMs)**的规模与能力都呈爆发式增长。诸如GPT-4、BERT、PaLM等模型参数量从最初的百万级到如今的千亿、万亿级别,训练难度和效率问题日益显著。在超大模型的训练过程中,梯度…...
第5.5章:ModelScope-Agent:支持多种API无缝集成的开源框架
5.5.1 ModelScope-Agent概述 ModelScope-Agent,由阿里巴巴旗下ModelScope社区开发,是一个开源的、模块化的框架,旨在帮助开发者基于大型语言模型快速构建功能强大、灵活性高的智能代理。它的核心优势在于支持与多种API和外部系统的无缝集成&…...
筑牢数字防线:商城系统安全的多维守护策略
一、构建网络安全防护屏障 网络安全是商城系统安全的第一道防线。企业应采用先进的防火墙技术,实时监控和过滤进出网络的流量,阻止非法访问和恶意攻击。入侵检测与防御系统(IDS/IPS)也是不可或缺的安全组件,它能够及…...