【设计模式系列】简单工厂模式
一、什么是简单工厂模式
简单工厂模式(Simple Factory Pattern)是一种设计模式,其中包含一个工厂类,根据传入的参数不同,返回不同类的实例。这个工厂类封装了对象的创建逻辑,使得客户端代码可以从直接创建对象的复杂性中解放出来。
二、简单工厂模式的角色
-
抽象产品(Product):
- 定义了产品的接口或者抽象类,所有的具体产品类都应该实现这个接口或继承这个抽象类。
- 它规定了具体产品对象必须实现的接口。
-
具体产品(Concrete Product):
- 实现了抽象产品接口的具体产品类。
- 工厂模式创建的最终对象,是具体产品类的实例。
-
抽象工厂(Creator):
- 提供了一个创建产品的接口,用于创建和返回一个产品实例。
- 它可能包含一个或多个创建产品对象的方法。
-
具体工厂(Concrete Creator):
- 实现了抽象工厂接口的具体工厂类。
- 它负责实例化具体的产品对象,并且返回一个产品实例。
三、简单工厂模式的典型应用场景
-
对象的创建需要灵活性: 当对象的创建依赖于多个条件,或者需要根据不同的输入参数来创建不同类型的对象时,工厂模式提供了一种灵活的方式来处理这些情况。
-
创建对象成本较高: 当对象的创建过程中涉及到复杂的逻辑或者资源消耗较大时,使用工厂模式可以封装这些复杂的创建过程,使得客户端代码更加简洁。
-
数据库连接池: 在需要创建数据库连接时,可以使用工厂模式来封装创建连接的过程,同时可以管理连接的生命周期。
四、简单工厂模式在StaticListableBeanFactory
中的应用
StaticListableBeanFactory
是 Spring 框架中 BeanFactory
接口的一个具体实现,它是一种特殊类型的工厂,用于存储和管理 bean 的实例。在工厂模式中,工厂类负责创建对象,而在 StaticListableBeanFactory
中,这个对象就是 Spring 容器管理的 bean。这个工厂是一个静态的工厂,意味着它不基于 bean 的定义来动态创建 bean,而是在工厂初始化时就添加了所有 bean 的实例。
在工厂模式的应用中,StaticListableBeanFactory
扮演了以下几个角色:
-
抽象工厂(Factory):提供了一个接口或抽象类,定义了创建对象的方法。在
StaticListableBeanFactory
中,这个接口是由BeanFactory
提供的,它定义了getBean
等方法来获取 bean 实例。 -
具体工厂(Concrete Factory):实现了工厂接口的具体类,负责创建具体产品的对象。
StaticListableBeanFactory
就是具体工厂的实现,它通过addBean
方法静态地添加 bean 实例。 -
抽象产品(Product):工厂模式中创建的对象。在 Spring 中,这些对象就是由
StaticListableBeanFactory
管理的 bean。 -
具体产品(Concrete Product):实现了产品接口的具体类。在 Spring 的上下文中,这些是由
StaticListableBeanFactory
管理的具体 bean 实例。
StaticListableBeanFactory
在工厂模式中的应用特点如下:
-
静态实例管理:
StaticListableBeanFactory
存储的是 bean 的实例,而不是基于 bean 定义来动态创建实例。这意味着所有的 bean 必须在工厂初始化时就已经存在。 -
单例管理:
StaticListableBeanFactory
只支持单例 bean,不支持原型(prototype)bean。这是因为它在初始化时就已经创建了 bean 的实例,并且存储起来供后续使用。 -
列表功能:由于实现了
ListableBeanFactory
接口,StaticListableBeanFactory
支持通过类型来检索 bean,这允许客户端代码可以通过类型来获取所有匹配的 bean 列表。 -
简单性:
StaticListableBeanFactory
是一个简化版的 bean 工厂,它不支持 bean 的生命周期管理、依赖注入、bean 后处理等高级功能,因此适用于简单的应用场景。
下面是一个简单的示例,展示了如何使用 StaticListableBeanFactory
来实现工厂模式:
//抽象工厂
public interface BeanFactory {<T> T getBean(String name, Class<T> requiredType) throws BeansException;Object getBean(String name, Object... args) throws BeansException;}//具体工厂
public class StaticListableBeanFactory implements BeanFactory {@Overridepublic Object getBean(String name) throws BeansException {String beanName = BeanFactoryUtils.transformedBeanName(name);Object bean = this.beans.get(beanName);if (bean == null) {throw new NoSuchBeanDefinitionException(beanName,"Defined beans are [" + StringUtils.collectionToCommaDelimitedString(this.beans.keySet()) + "]");}if (BeanFactoryUtils.isFactoryDereference(name) && !(bean instanceof FactoryBean)) {throw new BeanIsNotAFactoryException(beanName, bean.getClass());}if (bean instanceof FactoryBean && !BeanFactoryUtils.isFactoryDereference(name)) {try {return ((FactoryBean<?>) bean).getObject();}catch (Exception ex) {throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);}}else {return bean;}}public void addBean(String name, Object bean) {this.beans.put(name, bean);}}// 具体产品
class MyBean {public void doSomething() {System.out.println("Doing something");}
}//客户端
public class StaticListableBeanFactoryExample {public static void main(String[] args) {// 创建 StaticListableBeanFactory 实例StaticListableBeanFactory beanFactory = new StaticListableBeanFactory();// 创建一个具体的产品实例MyBean myBean = new MyBean();// 将产品实例添加到工厂中,关联一个名称beanFactory.addBean("myBeanName", myBean);// 从工厂中获取产品实例MyBean bean = beanFactory.getBean("myBeanName", MyBean.class);// 使用产品bean.doSomething();}
}
在这个示例中,MyBean
是具体产品,我们创建了它的一个实例,并将其添加到 StaticListableBeanFactory
中。然后,我们可以通过工厂的 getBean
方法来获取这个 bean 并使用它。这个过程展示了工厂模式的典型应用,即通过工厂来封装对象的创建过程,使得客户端代码更加简洁,并且解耦了对象的创建和使用。
相关文章:

【设计模式系列】简单工厂模式
一、什么是简单工厂模式 简单工厂模式(Simple Factory Pattern)是一种设计模式,其中包含一个工厂类,根据传入的参数不同,返回不同类的实例。这个工厂类封装了对象的创建逻辑,使得客户端代码可以从直接创建…...

给定一个正整数n随机生成n个字节即生成2n个十六进制数将其组成字符串返回secrets.token_hex(n)
【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 给定一个正整数n 随机生成n个字节 即生成2n个十六进制数 将其组成字符串返回 secrets.token_hex(n) [太阳]选择题 根据题目代码,执行的结果错误的是? import secrets …...
[Gtk] 工程
MediaPlayer 可执行文件工程 结构 . ├── BUILD ├── ButtonHelper.cpp ├── ButtonHelper.h ├── CMakeLists.txt ├── DrawingAreaHelper.cpp ├── DrawingAreaHelper.h ├── layout.ui └── main.cpp CMakeLists.txt # 1) cmake basic cmake_minimum_r…...

基于Multisim的汽车尾灯控制电路设计与仿真
假设汽车尾部左右量测各有3个指示灯(用发光二极管模拟)1. 汽车正常运行时指示灯全灭;2.右转弯时,右侧3个指示灯按右循环顺序点亮;.3. 左转弯时,左侧3个指示灯按左循环顺序点亮;4.临时刹车时所有…...
Leetcode 3326. Minimum Division Operations to Make Array Non Decreasing
Leetcode 3326. Minimum Division Operations to Make Array Non Decreasing 1. 解题思路2. 代码实现 题目链接:3326. Minimum Division Operations to Make Array Non Decreasing 1. 解题思路 这一题的话就是要看出来题中给出的operation的本质事实上就是将任意…...

redo文件误删除后通过逻辑备份进行恢复
问题描述 开发同事让在一个服务器上查找下先前库的备份文件是否存在,如果存在进行下恢复。翻了服务器发现备份文件存在,多愁了一眼竟翻到了该备份文件于2024.6.17日恢复过的日志,赶紧和开发沟通说2024.6.17号已经恢复过了为啥还要恢复&#x…...
7805的输出电压如何调整?
7805稳压集成电路的输出电压通常是固定的,标称为5V。然而,在实际应用中,可以通过一些方法调整其输出电压,尽管这些调整方法可能会使电路变得更加复杂或需要额外的元件。以下是几种可能的调整方法: 1. 使用不同型号的稳…...

git命令使用一览【自用】
git常见操作: git initgit remote add master【分支名字】 gitgits.xxxxx【仓库中获取的ssh链接或者http协议的链接】检查远程仓库是否链接成功。 git remote -v出现以下画面就可以git pull,git push了...
MES系列-报表和分析
MES系列-报表和分析 MES系列文章目录 ISA-95制造业中企业和控制系统的集成的国际标准-(1) ISA-95制造业中企业和控制系统的集成的国际标准-(2) ISA-95制造业中企业和控制系统的集成的国际标准-(3) ISA-95制造业中企业和控制系统的集成的国际标准-(4) ISA-95制造业中企业和控制…...

如何在分布式环境中实现高可靠性分布式锁
目录 一、简单了解分布式锁 (一)分布式锁:应对分布式环境的同步挑战 (二)分布式锁的实现方式 (三)分布式锁的使用场景 (四)分布式锁需满足的特点 二、Redis 实现分…...

Vue基础(4)
自定义指令 除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。在vue中使用directive来创建自定义指令 钩子函数 指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用&…...

Redis高阶篇之Redis单线程与多线程
文章目录 0 前言1. 为什么Redis是单线程?1.1 Redis单线程1.2 为什么Redis3时代单线程快的原因1.3 使用单线程原因 2.为什么逐渐加入多线程呢?2.1 如何解决 3.redis6/7的多线程特性和IO多路复用入门3.1主线程和IO线程怎么协作完成请求处理的3.2 Unix网络编…...

【C++】STL——priority_queue优先级队列
目录 前言priority_queue的使用简单使用在OJ中的使用 priority_queue的模拟实现基本功能仿函数在这里插入图片描述 前言 上一节我们说了stack和queue这两种容器适配器,而priority_queue(优先级队列)同样也是属于容器适配器,它会优…...

大数据新视界 --大数据大厂之大数据在智慧城市建设中的应用:打造智能生活的基石
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
使用枚举来实现策略模式
使用很多if else的场景 public void save(String type,Object data){if("db".equals(type)){saveInDb(data);}else if("file".equals(type)){saveInFile(data);}else if("oss".equals(type)){saveInOss(data);}}使用枚举来解决 public enum Save…...
区块链技术原理
1. 引言 区块链的定义 区块链是一种分布式账本技术(Distributed Ledger Technology,DLT),其核心特征是通过密码学的方式将数据打包成一个个区块,按时间顺序依次相连,形成一个不可篡改、公开透明的链式数据…...

Spring Boot 接口数据加解密
今天聊下接口安全问题,涉及到接口的加密和解密 经常和外部单位接口调用梳理了相关技术方案,主要的需求点如下: 1,尽量少改动,不影响之前的业务逻辑 2,考虑到时间紧迫性,可采用对称性加密方式&…...

2018年计算机网络408真题解析
第一题: 解析:TCP/IP体系结构应用层常用协议及其相应的运输层协议 TCP协议是面向连接可靠数据传输服务,UDP无连接不可靠的数据传输服务,IP无连接不可靠的数据连接服务。 FTP协议,SMTP协议和HTTP协议使用TCP协议提供的面…...

Javascript 脚本查找B站限时免费番剧
目录 前言 脚本编写 脚本 前言 B站的一些番剧时不时会“限时免费”,白嫖党最爱,主打一个又占到便宜的快乐。但是在番剧索引里却没有搜索选项可以直接检索“限时免费”的番剧,只能自己一页一页的翻去查看,非常麻烦。 自己找限…...
YoloV10改进策略:主干网络改进|DeBiFormer,可变形双级路由注意力|全网首发
摘要 在目标检测领域,YoloV10以其高效和准确的性能而闻名。然而,为了进一步提升其检测能力,我们引入了DeBiFormer作为YoloV10的主干网络。这个主干网络的计算量比较大,不过,上篇双级路由注意力的论文受到很大的关注,所以我也将这篇论文中的主干网络用来改进YoloV10,卡多…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

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 提…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...