【设计模式系列】简单工厂模式
一、什么是简单工厂模式
简单工厂模式(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,卡多…...
小白也能当对联大师!春联生成模型-中文-base开箱即用教程
小白也能当对联大师!春联生成模型-中文-base开箱即用教程 1. 前言:人人都能创作春联 春节贴春联是中国人延续千年的传统习俗,但创作一副对仗工整、寓意美好的春联并非易事。传统春联创作需要掌握平仄、对仗等复杂规则,这让许多对…...
OpenClaw+千问3.5-9B:自动化学习笔记整理系统
OpenClaw千问3.5-9B:自动化学习笔记整理系统 1. 为什么需要自动化笔记整理 作为一个长期与技术文档打交道的开发者,我发现自己陷入了一个困境:每天阅读大量技术文章、论文和在线课程,但收集的笔记却散落在不同平台——有些在One…...
SDXL 1.0电影级绘图工坊效果展示:1152x896竖版在手机端全屏展示效果
SDXL 1.0电影级绘图工坊效果展示:1152x896竖版在手机端全屏展示效果 1. 惊艳效果开场:手机端全屏观影体验 想象一下,在手机上打开一张AI生成的图片,画面瞬间充满整个屏幕——没有黑边,没有压缩失真,就像在…...
零代码实战:用OpenClaw和Qwen3.5-9B-AWQ-4bit制作表情包生成器
零代码实战:用OpenClaw和Qwen3.5-9B-AWQ-4bit制作表情包生成器 1. 为什么需要本地化表情包生成工具 作为一个长期混迹技术社区的老鸟,我经常需要在群聊中快速制作贴合讨论主题的表情包。传统方式要么依赖在线生成器(存在隐私风险࿰…...
代理商客户归管+赊欠账明细查询,易特进销存商贸版一键解决
做商贸生意的朋友,大概率会遇到这样的难题:发展了代理商拓展市场,代理商的客户却需要公司统一管理,既要明确客户归属,又要精准统计赊欠账目。比如代理商张三,总共欠公司1万元,查账时想清晰看到他…...
实现堆和用堆实现排序数组
什么是堆 就是完全二叉树 前h-1层都是满的 最后一层可以不满,但从左到右必须连续。 逻辑上是链 物理上是数组 首先,实现堆 一、定义一个结构体,用来存3个值 a就是的数组地址 size是有效元素的个数 capacity是总容量,size…...
不要让接口过早失去可选项
这,是一个采用C精灵库编写的程序,它画了一幅漂亮的图形: 复制代码 #include "sprites.h" //包含C精灵库 Sprite turtle; //建立角色叫turtle void draw(int d){for(int i0;i<5;i)turtle.fd(d).left(72); } int main(){ …...
OpenClaw飞书机器人配置:Phi-3-mini-128k-instruct对话式任务触发
OpenClaw飞书机器人配置:Phi-3-mini-128k-instruct对话式任务触发 1. 为什么选择飞书OpenClawPhi-3的组合? 去年团队规模扩张到15人时,我突然发现每天要花2小时处理各种琐碎请求:"下周会议材料准备好了吗?"…...
Go语言的gRPC服务开发
Go语言的gRPC服务开发 1. gRPC简介 gRPC是Google开发的高性能、开源的RPC框架,基于HTTP/2协议和Protocol Buffers序列化格式。它支持多种语言,包括Go、Java、C、Python等,非常适合构建微服务架构。 gRPC的优势 高性能:基于HTTP/2协…...
新手福音:在快马平台用AI生成openclaw命令实操案例,轻松入门运维自动化
作为一个刚接触运维的新手,第一次看到openclaw这个命令时确实有点懵。不过最近在InsCode(快马)平台上发现了一个超实用的功能,可以通过AI直接生成可运行的openclaw示例代码,还能实时测试效果,简直是新手福利!下面我就用…...
