设计模式(工厂模式)
工厂设计模式:打造你的代码生产线
引言
想象一下,你正站在一家现代化的玩具工厂门前。工厂内部,各种机器有条不紊地运转,原材料在传送带上流动,最终变成精美的玩具。你不需要了解每个玩具的具体制作工艺,只需告诉工厂经理:“我需要一个泰迪熊”,工厂就会为你生产出来。这正是工厂设计模式的核心思想 — 封装对象的创建过程,使客户端代码与具体产品的实现细节解耦。
什么是工厂设计模式?
工厂设计模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,而是通过使用一个共同的接口来指向新创建的对象。
工厂模式主要分为三种类型:
- 简单工厂模式(Simple Factory)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
简单工厂模式:披萨店的点单系统
场景描述
想象你走进了一家披萨店。你不需要自己准备面团、酱料和配料,只需告诉服务员你想要什么类型的披萨(如"奶酪披萨"、“素食披萨"或"肉食披萨”),服务员就会将你的订单传递给厨房,厨房(工厂)将为你制作披萨。
代码实现
// 披萨接口
interface Pizza {void prepare();void bake();void cut();void box();
}// 具体披萨类 - 奶酪披萨
class CheesePizza implements Pizza {@Overridepublic void prepare() {System.out.println("准备奶酪披萨的原料...");}@Overridepublic void bake() {System.out.println("烘烤奶酪披萨...");}@Overridepublic void cut() {System.out.println("切割奶酪披萨...");}@Overridepublic void box() {System.out.println("包装奶酪披萨...");}
}// 具体披萨类 - 素食披萨
class VeggiePizza implements Pizza {@Overridepublic void prepare() {System.out.println("准备素食披萨的原料...");}@Overridepublic void bake() {System.out.println("烘烤素食披萨...");}@Overridepublic void cut() {System.out.println("切割素食披萨...");}@Overridepublic void box() {System.out.println("包装素食披萨...");}
}// 简单工厂
class SimplePizzaFactory {public Pizza createPizza(String type) {Pizza pizza = null;if (type.equals("cheese")) {pizza = new CheesePizza();} else if (type.equals("veggie")) {pizza = new VeggiePizza();}// 可以添加更多披萨类型...return pizza;}
}// 披萨店类
class PizzaStore {private SimplePizzaFactory factory;public PizzaStore(SimplePizzaFactory factory) {this.factory = factory;}public Pizza orderPizza(String type) {Pizza pizza = factory.createPizza(type);pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}
}// 客户端代码
public class SimplePizzaExample {public static void main(String[] args) {SimplePizzaFactory factory = new SimplePizzaFactory();PizzaStore store = new PizzaStore(factory);// 订购奶酪披萨Pizza cheesePizza = store.orderPizza("cheese");System.out.println("小明订购了一个奶酪披萨\n");// 订购素食披萨Pizza veggiePizza = store.orderPizza("veggie");System.out.println("小红订购了一个素食披萨");}
}
简单工厂模式的优缺点
优点:
- 客户端不需要知道具体产品类的类名,只需知道对应的参数即可
- 将创建实例的过程与使用实例的过程分离,使用者不必关心创建的细节
缺点:
- 工厂类集中了所有产品的创建逻辑,一旦工厂类出现问题,整个系统都会受到影响
- 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,违反了开闭原则
工厂方法模式:特色地区披萨店连锁
场景描述
随着业务扩展,披萨店开始在不同城市开设分店。每个地区的分店都有自己的特色披萨。比如,纽约店的披萨饼皮薄而脆,而芝加哥店的披萨饼皮厚实松软。这时候,简单工厂已经不能满足需求,需要让各个分店能够创建自己特色的披萨。
代码实现
// 披萨接口
interface Pizza {void prepare();void bake();void cut();void box();String getName();
}// 纽约风格奶酪披萨
class NYStyleCheesePizza implements Pizza {private String name = "纽约风格奶酪披萨";@Overridepublic void prepare() {System.out.println("准备 " + name);}@Overridepublic void bake() {System.out.println("烘烤25分钟");}@Overridepublic void cut() {System.out.println("对角线切片");}@Overridepublic void box() {System.out.println("放入纽约披萨店盒子中");}@Overridepublic String getName() {return name;}
}// 芝加哥风格奶酪披萨
class ChicagoStyleCheesePizza implements Pizza {private String name = "芝加哥风格深盘奶酪披萨";@Overridepublic void prepare() {System.out.println("准备 " + name);}@Overridepublic void bake() {System.out.println("烘烤40分钟");}@Overridepublic void cut() {System.out.println("方块切片");}@Overridepublic void box() {System.out.println("放入芝加哥披萨店盒子中");}@Overridepublic String getName() {return name;}
}// 抽象披萨店
abstract class PizzaStore {public Pizza orderPizza(String type) {Pizza pizza = createPizza(type);pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}// 工厂方法protected abstract Pizza createPizza(String type);
}// 纽约披萨店
class NYPizzaStore extends PizzaStore {@Overrideprotected Pizza createPizza(String type) {if (type.equals("cheese")) {return new NYStyleCheesePizza();}// 可以添加更多纽约风格披萨...return null;}
}// 芝加哥披萨店
class ChicagoPizzaStore extends PizzaStore {@Overrideprotected Pizza createPizza(String type) {if (type.equals("cheese")) {return new ChicagoStyleCheesePizza();}// 可以添加更多芝加哥风格披萨...return null;}
}// 客户端代码
public class FactoryMethodExample {public static void main(String[] args) {PizzaStore nyStore = new NYPizzaStore();PizzaStore chicagoStore = new ChicagoPizzaStore();Pizza pizza = nyStore.orderPizza("cheese");System.out.println("小明订购了 " + pizza.getName() + "\n");pizza = chicagoStore.orderPizza("cheese");System.out.println("小红订购了 " + pizza.getName());}
}
工厂方法模式的优缺点
优点:
- 符合开闭原则,新增产品时,只需添加具体工厂和产品类,不需要修改原有代码
- 符合单一职责原则,每个具体工厂只负责创建对应的产品
- 客户端只需要知道产品的抽象类,无须关心具体实现类
缺点:
- 类的个数容易过多,增加复杂度
- 增加了系统的抽象性和理解难度
抽象工厂模式:披萨原料工厂
场景描述
随着披萨连锁店的成功,管理层决定统一原料供应链,确保每家分店都使用高质量的原料。不同地区的披萨店需要使用不同风格的原料(如纽约的薄面团和马苏里拉奶酪,芝加哥的厚面团和意大利白干酪)。
代码实现
// 原料接口
interface Dough {String toString();
}interface Sauce {String toString();
}interface Cheese {String toString();
}// 具体原料类
class ThinCrustDough implements Dough {public String toString() {return "薄饼皮";}
}class ThickCrustDough implements Dough {public String toString() {return "厚饼皮";}
}class MarinaraSauce implements Sauce {public String toString() {return "番茄酱";}
}class PlumTomatoSauce implements Sauce {public String toString() {return "李子番茄酱";}
}class MozzarellaCheese implements Cheese {public String toString() {return "马苏里拉奶酪";}
}class ReggianoCheese implements Cheese {public String toString() {return "雷吉亚诺奶酪";}
}// 抽象原料工厂
interface PizzaIngredientFactory {Dough createDough();Sauce createSauce();Cheese createCheese();// 可以添加更多原料...
}// 具体原料工厂 - 纽约
class NYPizzaIngredientFactory implements PizzaIngredientFactory {@Overridepublic Dough createDough() {return new ThinCrustDough();}@Overridepublic Sauce createSauce() {return new MarinaraSauce();}@Overridepublic Cheese createCheese() {return new ReggianoCheese();}
}// 具体原料工厂 - 芝加哥
class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {@Overridepublic Dough createDough() {return new ThickCrustDough();}@Overridepublic Sauce createSauce() {return new PlumTomatoSauce();}@Overridepublic Cheese createCheese() {return new MozzarellaCheese();}
}// 抽象产品 - 披萨
abstract class Pizza {String name;Dough dough;Sauce sauce;Cheese cheese;abstract void prepare();void bake() {System.out.println("烘烤175度,25分钟");}void cut() {System.out.println("将披萨对角切片");}void box() {System.out.println("将披萨放在官方盒子里");}void setName(String name) {this.name = name;}String getName() {return name;}public String toString() {StringBuilder result = new StringBuilder();result.append("---- ").append(name).append(" ----\n");if (dough != null) {result.append(dough).append("\n");}if (sauce != null) {result.append(sauce).append("\n");}if (cheese != null) {result.append(cheese);}return result.toString();}
}// 具体产品 - 奶酪披萨
class CheesePizza extends Pizza {PizzaIngredientFactory ingredientFactory;public CheesePizza(PizzaIngredientFactory ingredientFactory) {this.ingredientFactory = ingredientFactory;}@Overridevoid prepare() {System.out.println("准备 " + name);dough = ingredientFactory.createDough();sauce = ingredientFactory.createSauce();cheese = ingredientFactory.createCheese();}
}// 改进后的披萨店
abstract class PizzaStore {public Pizza orderPizza(String type) {Pizza pizza = createPizza(type);pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}protected abstract Pizza createPizza(String type);
}// 纽约披萨店
class NYPizzaStore extends PizzaStore {@Overrideprotected Pizza createPizza(String type) {Pizza pizza = null;PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();if (type.equals("cheese")) {pizza = new CheesePizza(ingredientFactory);pizza.setName("纽约风格奶酪披萨");}// 可以添加更多纽约风格披萨...return pizza;}
}// 芝加哥披萨店
class ChicagoPizzaStore extends PizzaStore {@Overrideprotected Pizza createPizza(String type) {Pizza pizza = null;PizzaIngredientFactory ingredientFactory = new ChicagoPizzaIngredientFactory();if (type.equals("cheese")) {pizza = new CheesePizza(ingredientFactory);pizza.setName("芝加哥风格奶酪披萨");}// 可以添加更多芝加哥风格披萨...return pizza;}
}// 客户端代码
public class AbstractFactoryExample {public static void main(String[] args) {PizzaStore nyStore = new NYPizzaStore();PizzaStore chicagoStore = new ChicagoPizzaStore();Pizza pizza = nyStore.orderPizza("cheese");System.out.println("小明订购了:\n" + pizza + "\n");pizza = chicagoStore.orderPizza("cheese");System.out.println("小红订购了:\n" + pizza);}
}
抽象工厂模式的优缺点
优点:
- 产品族的约束性,确保一系列相关的产品对象被一起创建
- 将一个系列的产品族统一到一起创建,减少了具体产品对象的依赖
- 符合开闭原则,易于扩展,可以在不修改已有代码的情况下引入新的产品族
缺点:
- 扩展产品族比较困难,需要修改抽象工厂的接口
- 比工厂方法模式更加抽象,更难理解
工厂模式在实际开发中的应用
工厂模式在许多框架和应用中被广泛使用:
-
Java集合框架:
Collections.singleton()
、Collections.singletonList()
等方法都是工厂方法的实现。 -
JDBC连接数据库:通过
DriverManager.getConnection()
方法获取数据库连接对象,隐藏了具体数据库连接的细节。 -
Spring框架:Spring的BeanFactory是工厂模式的典型应用,它根据配置文件创建不同的Bean对象。
-
日志框架:如Log4j、SLF4J等,它们使用工厂模式创建不同的日志对象。
总结
工厂设计模式是一种非常实用的创建型设计模式,它通过封装对象的创建过程,使客户端代码与具体产品的实现细节解耦。根据不同的需求和场景,我们可以选择使用简单工厂、工厂方法或抽象工厂。
- 简单工厂:适用于产品种类相对固定,变化不大的场景。
- 工厂方法:适用于产品种类多样化,需要不同工厂创建不同产品的场景。
- 抽象工厂:适用于需要创建一系列相关或依赖对象的场景,无须指定它们的具体类。
相关文章:
设计模式(工厂模式)
工厂设计模式:打造你的代码生产线 引言 想象一下,你正站在一家现代化的玩具工厂门前。工厂内部,各种机器有条不紊地运转,原材料在传送带上流动,最终变成精美的玩具。你不需要了解每个玩具的具体制作工艺,…...
本地大模型编程实战(29)查询图数据库NEO4J(2)
上一篇文章 用大语言模型LLM查询图数据库NEO4J(1) 介绍了使用GraphQACypherChain查询NEO4J。用它实现简单快捷,但是不容易定制,在生产环境中可能会面临挑战。 本文将基于langgraph 框架,用LLM(大语言模型)查询图数据库NEO4J。它可以定义清晰复…...
Python爬虫(10)Python数据存储实战:基于pymongo的MongoDB开发深度指南
目录 一、为什么需要文档型数据库?1.1 数据存储的范式变革1.2 pymongo的核心优势 二、pymongo核心操作全解析2.1 环境准备2.2 数据库连接与CRUD操作2.3 聚合管道实战2.4 分批次插入百万级数据(进阶)2.5 分批次插入百万级数据(进阶…...
从遍历序列构造二叉树:前序+中序与中序+后序的递归解法详解
文章目录 1. 问题背景2. 核心思路3. 从前序与中序遍历序列构造二叉树3.1 递归分治思路3.2 代码实现与注释 4. 从中序与后序遍历序列构造二叉树4.1 递归分治思路4.2 代码实现与注释 5. 复杂度分析6. 总结 1. 问题背景 二叉树的遍历方式包括前序(根-左-右)…...
数据挖掘专栏介绍:用 Python + 大语言模型 (LLM) 重塑电商数据价值
写在前面 —— 不止于挖掘,更要智能涌现:用 Python + 大语言模型 (LLM) 重塑电商数据价值 或许你已经跟随我们之前的 “零基础上手Python数据分析” 专栏,掌握了 Pandas 的数据操纵、Matplotlib/Seaborn 的可视化呈现,甚至对传统的数据挖掘技术如聚类、分类、回归有了初步…...
CSS Transition入门指南
CSS Transition 完全指南 目录 Transition 的作用核心属性代码示例使用场景性能优化常见问题思维导图 1. Transition 的作用 CSS Transition 用于在 属性值变化时 创建平滑的过渡效果。例如: 鼠标悬停时按钮放大元素颜色渐变切换位置移动的缓动效果 2. 核心属性…...
Nginx 核心功能
目录 一、基于授权的访问控制 (1)使用htpasswd 生成用户认证文件 (2)修改密码文件权限为400,将所有者改为nginx ,设置 Nginx 的运行用户能够读取 (3)修改主配置文件 nginx.conf&…...
排序版研究方向
姓 名研究方向电子邮箱办公电话办公地点曹培根代数cao2024ustc.edu.cn 新楼412陈洪佳代数hjchenustc.edu.cn0551-636076931529陈小伍代数xwchenmail.ustc.edu.cn0551-636062351321梁永祺代数yqliangustc.edu.cn0551-636006171613欧阳毅代数yiouyangustc.edu.cn0551-63600337…...
AI国学智慧语录视频,条条视频10W+播放量
家人们!图书类带货玩法真的非常多,之前也分享过蛮多,例如情感语录、育儿教育、爆款图书金句类、AI历史人物解说类等等。 本期继续来分享一个对于普通人来说,上手相当简单,容易起号,可作为长线深耕的AI带货…...
RN 获取视频封面,获取视频第一帧
严格的说,没有解决这个问题,实际上是绕过了这个问题,严格的说获取的也不是第一帧。 RN的video 视频应用,大多是这样的 1、安装 yarn add react-native-video 2、导入 import Video from react-native-video; 3、使用 …...
缓存分片哈希 vs 一致性哈希:优缺点、区别对比及适用场景(图示版)
📜 引言 在分布式缓存系统中,数据分布策略是设计的关键之一。缓存分片哈希和一致性哈希是两种常见的数据分布算法,它们各有优缺点和适用场景。本文将通过图示对比表格,深入解析这两种算法的核心原理、优缺点及适用场景。 &#x…...
iOS - 音频: Core Audio - 播放
环境 iOS 18 Xcode 16.3 swift-driver version: 1.120.5 Apple Swift version 6.1 (swiftlang-6.1.0.110.21 clang-1700.0.13.3) Target: x86_64-apple-macosx15.0 Core Audio 的架构 声音数据的描述 sample: 一个声道采样的值,采样率定义了每秒从连续信号中提取并组成离散信号…...
Nerfstudio 环境配置与自有数据集(图片和视频)测试全方位全流程实战【2025最新版!!】
一、引言 神经辐射场(Neural Radiance Fields,简称NeRF)是近年来计算机视觉和图形学领域的一项革命性技术,它能够从2D图像中学习复杂的3D场景表示。然而,NeRF技术的实现和应用门槛较高,需要较为专业的计算机视觉和深度学习知识。…...
【Java学习】动态代理有哪些形式?
Java动态代理的两种主要形式 动态代理在Java中有两种主要的实现方式,它们各有特点和使用场景: 1. JDK动态代理 (基于接口) 特点: Java标准库自带的功能(java.lang.reflect.Proxy)只能代理接口,不能代理…...
Android Studio 中实现方法和参数显示一行
Android Studio 中实现方法和参数显示一行,可通过以下步骤配置: 一、基础格式化设置 快捷键格式化 选中代码后使用 Ctrl Alt L(Windows/Linux)或 Cmd Option L(Mac)进行快速格式化27。 菜单操作…...
SQLyog中DELIMITER执行存储过程时出现的前置缩进问题
在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为。以下是详细解释和解决方案: 问题根源 SQLyog的语句分隔逻辑: SQLyog默认会根据分号(;)和换行自动分隔SQL语句 当代码有缩进时,SQLy…...
基于Spring Boot 3.0、ShardingSphere、PostgreSQL或达梦数据库的分库分表
要实现基于Spring Boot 3.0、ShardingSphere、PostgreSQL或达梦数据库的分库分表,首先需要对ShardingSphere进行一些基本配置。你提到的溯源码、批次号等数据需要考虑到跨年数据的存储,因此要设计一个能够动态扩展的分表策略 添加ShardingSphere依赖 在…...
vscode chrome调试怎么在所有浏览器都好使
chrome调试时只能在打开的浏览器里进行调试,其它打开的chrome浏览器就不能调试了,怎么解决。 右键点击 Chrome 的快捷方式图标,选择属性 在目标一栏,最后加上--remote-debugging-port9222 注意要用空格隔开 lanch.json 文件配置 …...
20250429在Ubuntu 20.04.6下安装VMware Workstation16
20250429在Ubuntu 20.04.6下安装VMware Workstation16 2025/4/29 20:16 缘起:1、在ubuntu14.04下git clone异常该如何处理呢? 2、请问 现在 编译NanoPi NEO的FriendlyCore系统使用ubuntu哪一个版本比较好? ubuntu14.04 编译异常/下载不了&am…...
Java高频面试之并发编程-10
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:ThreadLocalMap 怎么解决 Hash 冲突的? ThreadLocalMap 是 ThreadLocal 的核心实现,它采用 开放…...
【Tauri2】035——sql和sqlx
前言 这篇就来看看插件sql SQL | Taurihttps://tauri.app/plugin/sql/ 正文 准备 添加依赖 tauri-plugin-sql {version "2.2.0",features ["sqlite"]} features可以是mysql、sqlite、postsql 进去features看看 sqlite ["sqlx/sqlite&quo…...
C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 16)
🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 […...
VScode与远端服务器SSH链接
这里写自定义目录标题 简介步骤 简介 这里是使用密钥文件链接 步骤 首先在windows CMD中运行 ssh-keygen -t rsa,生成本机的公钥和私钥 这里id rsa.pub就是公钥,在服务器端使用,id rsa是私钥在用户端使用;通常目录在C:/Users/Your name/…...
数据结构入门:详解顺序表的实现与操作
目录 1.线性表 2.顺序表 2.1概念与结构 2.2分类 2.2.1静态顺序表 2.2.2动态顺序表 3.动态顺序表的实现 3.1.SeqList.h 3.2.SeqList.c 3.2.1初始化 3.2.2销毁 3.2.3打印 3.2.4顺序表扩容 3.2.5尾部插入及尾部删除 3.2.6头部插入及头部删除 3.2.7特定位置插入…...
Reactor框架介绍
Reactor(反应器模式)是一种事件驱动的设计模式,广泛用于高性能网络编程和异步I/O处理。它的核心思想是将事件分发与业务逻辑解耦,通过统一的机制处理多路I/O事件。 这个在android蓝牙中大量使用,如果这里不懂,那么很难看懂底层的逻辑,所以我们在这片文章中做一个介绍 …...
Nacos 3.0 正式发布:MCP Registry、安全零信任、链接更多生态
Nacos 3.0 正式版本发布啦!升级 MCP Registry,围绕着 MCP 服务管理,MCP 多种类型注册,包含 MCP Server 注册、编排、动态调试和管理,并且提供 Nacos-MCP-Router 可以进行 MCP 动态发现,可以自动安装、代理 …...
前端安全中的XSS(跨站脚本攻击)
XSS 类型 存储型 XSS 特征:恶意脚本存储在服务器(如数据库),用户访问受感染页面时触发。场景:用户评论、论坛帖子等持久化内容。影响范围:所有访问该页面的用户。 反射型 XSS 特征:恶意脚本通过…...
go单向链表
需求 实现单向链表的节点顺序添加、顺序遍历。 实现 package mainimport ("fmt" )type zodiac_sign struct {number intdizhi stringanimal stringyear intnext *zodiac_sign }// 添加 // func add_node_by_order(previous_node zodiac_sign, current_node z…...
Python小程序:上班该做点摸鱼的事情
系统提醒 上班会忘记一些自己的事,所以你需要在上班的的时候突然给你弹窗,你就知道要做啥了 源码 # -*- coding:utf-8 -*- """ 作者:杨桃清 日期: 2025年04日29 21:51:24 """ import datetime import time import thre…...
uni-app中使用RenderJs 使用原生js
RenderJs运行的层叫【视图层】,Uniapp原生Script叫【逻辑层】,逻辑层要调用视图层需要使用一个叫【watcher】,具体怎么调用呢 为了实现这两层之间的通信,uniapp提供了一些特定的机制。以下是对这些通信机制的详细解释,…...
51c自动驾驶~合集37
我自己的原文哦~ https://blog.51cto.com/whaosoft/13878933 #DETR->DETR3D->Sparse4D 走向长时序稀疏3D目标检测 一、DETR 图1 DETR架构 DETR是第一篇将Transformer应用到目标检测方向的算法。DETR是一个经典的Encoder-Decoder结构的算法,它的骨干网…...
uniapp 小程序 安卓苹果 短视频解决方案
需求 要做类似抖音小程序的功能 思路 uniapp 使用swiper滑块 实现滑动 使用video播放视频 遇到的问题 1 video组件在小程序可以使用 uni.createVideoContext api控制 2 但是在app端会有层级问题(因为使用的原生组件具体看官方文档)导致无法正常滑动…...
LeetCode58_最后一个单词的长度
LeetCode58_最后一个单词的长度 标签:#字符串Ⅰ. 题目Ⅱ. 示例 0. 个人方法 标签:#字符串 Ⅰ. 题目 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、…...
深入理解Spring AI框架的核心概念
深入理解Spring AI框架的核心概念 前言 在当今人工智能飞速发展的时代,将AI技术集成到应用程序中已成为众多开发者关注的焦点。Spring AI框架为Java开发者提供了便捷的途径来实现这一目标。理解其核心概念对于充分发挥框架的潜力至关重要。本文将详细探讨Spring A…...
技术驱动与模式创新:开源AI大模型与S2B2C商城重构零售生态
摘要:在移动互联网与人工智能技术深度融合的背景下,零售行业正经历从“人找货”到“货找人”的范式转移。本文以开源AI大模型、AI智能名片、S2B2C商城小程序源码为核心技术要素,结合无人便利店、盒马鲜生、王府井二次元业态等商业实践&#x…...
精益数据分析(30/126):电商商业模式的深度剖析与关键指标解读
精益数据分析(30/126):电商商业模式的深度剖析与关键指标解读 在创业与数据分析的漫漫征途中,我们都在不断探寻如何更好地理解和运用商业数据,以实现业务的蓬勃发展。今天,我依旧带着和大家共同进步的初心…...
玩玩OCR
一、Tesseract: 1.下载windows版: tesseract 2. 安装并记下路径,等会要填 3.保存.py文件 import pytesseract from PIL import Image def ocr_local_image(image_path):try:pytesseract.pytesseract.tesseract_cmd rD:\Programs\Tesseract-OCR\tesse…...
gradle 下载的tencent的镜像
distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-5.4.1-all.zip distributionUrlhttps://mirrors.aliyun.com/gradle/distributions/v5.4.1/gradle-5.4.1-all.zip 参考: gradle 镜像地址,解决 AS 下载缓慢或者下不下来的问题-CSDN博客...
【含文档+PPT+源码】基于微信小程序的乡村振兴民宿管理系统
项目介绍 本课程演示的是一款基于微信小程序的乡村振兴民宿管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该…...
【Redis——数据类型和内部编码和Redis使用单线程模型的分析】
文章目录 Redis的数据类型和内部编码单线程模型的工作过程Redis虽然是一个单线程模型,为啥效率那么高,速度快呢? 总而言之,Redis提供的哈希表容器并不一定真的是真的哈希表,而是在特点的场景下,用别的容器去…...
leetcode day37 474
474 一和零 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。 示例 1: 输入:s…...
【计算机视觉】目标检测:深度解析YOLOv9:下一代实时目标检测架构的创新与实战
深度解析YOLOv9:下一代实时目标检测架构的创新与实战 架构演进与技术创新YOLOv9的设计哲学核心创新解析1. 可编程梯度信息(PGI)2. 广义高效层聚合网络(GELAN)3. 轻量级设计 环境配置与快速开始硬件需求建议详细安装步骤…...
Android Studio Profiler
1.我们想要查看自己方法的调用链,或者分析方法耗时的情况,可以选择Android Studio的Profiler,比较方便快捷。如下: 2.基本的面板参数讲解: 3.可以通过搜索,查看对应的方法,以及方法的调用链…...
Android Studio for Platform(ASFP)真机调试
连接设备 由于ubuntu连接adb设备每次都需要配置usb权限,很麻烦。并且每次换设备还要重新配置,我多数设备都是用wifi的adb方式连接。 开发板显示 连接显示器配合usb鼠标或者遥控器操作(因为开发板默认开启了adb,我这里是使用有线…...
如何个人HA服务器地址和长期密钥
下面分两步说明如何获取你的 Home Assistant 服务器地址以及创建“长期访问令牌”(Long-Lived Access Token),并给出一个简单的 Python 调用示例。 一、获取 Home Assistant 服务器地址 默认域名/端口 如果你在本机或局域网内安装并使用默认设…...
生物化学笔记:神经生物学概论04 视觉通路简介视网膜视网膜神经细胞大小神经节细胞(视错觉)
视觉通路简介 神经节细胞的胞体构成一明确的解剖层次,其外邻神经纤维层,内接内丛状层,该层在鼻侧厚约10~20μm,最厚在黄斑区约60~80μm。 全部细胞数约为120万个(1000000左右)。 每个细胞有一轴突ÿ…...
C++——调用OpenCV和NVIDIA Video Codec SDK库实现使用GPU硬解码MP4视频文件
系列文章目录 参考博客 参考博客 参考博客 文章目录 系列文章目录前言一、下载安装NVIDIA Video Codec SDK1、下载NVIDIA Video Codec SDK2、安装NVIDIA Video Codec SDK 二、下载编译安装OpenCV1、下载OpenCV2、编译安装OpenCV3、配置环境变量4、报错解决报错一: …...
dify升级最新版本(保留已创建内容)
dify安装参考文章: DeepSeek+Dify本地部署私有化知识库 如果之前安装的时候,是通过docker镜像的方式。 从网上下载最新的dify包,下载地址: https://github.com/langgenius/dify 下载完成后,把文件覆盖原…...
4、RabbitMQ的七种工作模式介绍
目录 一、Simple(简单模式) 1.1 概念 1.2 代码实现 消费者 运行结果 二、Work Queue(工作队列) 2.1 概念 1.2 代码实现 生产者 消费者 运行结果 三、Publish/Subscribe(发布/订阅模式) 3.1 概念 3.2 代码实现 生产者…...
React Three Fiber 详解:现代 Web3D 的利器
React Three Fiber 详解:现代 Web3D 的利器 随着 Web 技术的发展,3D 场景与交互已经不再是游戏开发者的专利。越来越多的网站、产品页、交互动画,开始大量引入 3D 元素。要在 React 项目中高效使用 WebGL,React Three Fiber(简称 R3F)成为了目前最主流的选择。 今天这篇…...