设计模式 简单工厂 工厂方法模式 抽象工厂模式 Spring 工厂 BeanFactory 解析
工厂模式介绍
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。它是创建型模式。
简单工厂
简单工厂模式是指由一个工厂对象决定创建出哪一种产品类的实例, 但它不属于GOF 23种设计模式
简单工厂适用于工厂类负责创建的对象较少的场景, 且客户端只需要传入工厂类的参数, 对于如何创建对象的逻辑不需要关心
适用场景: 工厂类负责创建的对象较少 对于如何创建对象的逻辑不需要关心
优点: 只需要传入一个正确的参数 就可以获取所需要的对象 无需知道创建细节
缺点: 违背开闭原则 不易于扩展过于复杂的产品结构 新增产品需要修改工厂类的代码
以下我们用支付场景演示简单工厂用法
1.定义支付接口
/*** 支付接口** @author Lion Li*/
public interface IPay {void payment();
}
2.编写工厂实例
/*** 付款方式工厂** @author Lion Li*/
public class PayFactory {/*** 创建付款实例* Class<? extends IPay> 单一原则 限制必须是 IPay 的子类*/public IPay create(Class<? extends IPay> clazz) {if (null != clazz) {try {return clazz.newInstance();} catch (Exception e) {throw new RuntimeException(e);}}return null;}}
3.编写具体的支付类 例如: 微信 支付宝
/*** 微信支付** @author Lion Li*/
public class WxPay implements IPay {public void payment() {System.out.println("微信支付");}
}
/*** 支付宝支付** @author Lion Li*/
public class ZfbPay implements IPay {public void payment() {System.out.println("支付宝支付");}
}
4.编写测试类并运行测试
/*** @author Lion Li*/
public class Test {public static void main(String[] args) {IPay wx = new PayFactory().create(WxPay.class);IPay zfb = new PayFactory().create(ZfbPay.class);wx.payment();zfb.payment();}
}

工厂方法模式
工厂方法模式是指定义一个创建对象的接口, 但让实现这个接口的类来觉得实例化哪个类, 工厂方法让类的实例化推迟到子类中进行
适用场景: 创建对象需要大量重复的代码 不依赖于产品类实例如何被创建 实现等细节
优点: 用户只需要关心所需要产品对应的工厂 无需关心创建细节 加入新产品符合开闭原则 提供了系统的可扩展性
缺点: 类的个数容易过多 增加的代码的结构负责都 增加了系统的抽象性和理解难度
以下我们用汽车场景工厂方法模式用法
1.定义汽车接口规范
/*** 汽车接口规范** @author Lion Li*/
public interface ICar {void name();
}
2.编写汽车工厂接口规范
/*** 汽车工厂接口规范** @author Lion Li*/
public interface ICarFactory {ICar create();
}
3.编写具体的汽车种类 例如: 宝马 大众
/*** 宝马汽车** @author Lion Li*/
public class BaoMaCar implements ICar {public void name() {System.out.println("我是宝马");}
}
/*** 大众汽车** @author Lion Li*/
public class DaZhongCar implements ICar {public void name() {System.out.println("我是大众");}
}
4.编写具体的汽车工厂 例如: 宝马工厂 大众工厂
/*** 宝马汽车工厂** @author Lion Li*/
public class BaoMaCarFactory implements ICarFactory {public ICar create() {return new BaoMaCar();}
}
/*** 大众汽车工厂** @author Lion Li*/
public class DaZhongCarFactory implements ICarFactory {public ICar create() {return new DaZhongCar();}
}
5.编写测试类并运行测试
/*** @author Lion Li*/
public class Test {public static void main(String[] args){ICarFactory baomaFactory = new BaoMaCarFactory();ICar baoma = baomaFactory.create();baoma.name();ICarFactory dazhongFactory = new DaZhongCarFactory();ICar dazhong = dazhongFactory.create();dazhong.name();}}

抽象工厂
抽象工厂模式是指提供一个创建一系列相关或相互依赖对象的接口 无需指定他们具体的类
适用场景:
- 不依赖于产品类实例如何被创建等细节 强调一系列相关产品对象一起使用创建对象需要大量重复的代码
- 提供一个产品类的库 所有产品以同样的接口出现 从而不依赖于具体的实现
优点: 具体产品在应用层代码隔离 无需关心创建细节 将一个系列的产品统一到一起创建
缺点: 规定了所有可能被创建的产品集合 产品中扩展新产品困难 需要修改抽象工厂的接口 增加了系统的理解难度和抽象性
以下我们用多种出行方式来演示抽象工厂用法
1.定义产品接口规范
/*** 汽车接口规范** @author Lion Li*/
public interface ICar {void name();
}
/*** 飞机接口规范** @author Lion Li*/
public interface IAircraft {void name();
}
2.定义产品工厂接口规范
/*** 汽车工厂接口规范** @author Lion Li*/
public interface ICarFactory {ICar create();
}
/*** 飞机工厂接口规范** @author Lion Li*/
public interface IAircraftFactory {IAircraft create();
}
3.定义所有产品实现
/*** 宝马汽车** @author Lion Li*/
public class BaoMaCar implements ICar {public void name() {System.out.println("我是宝马");}
}
/*** 大众汽车** @author Lion Li*/
public class DaZhongCar implements ICar {public void name() {System.out.println("我是大众");}
}
/*** 波音飞机** @author Lion Li*/
public class BoYinAircraft implements IAircraft {public void name() {System.out.println("我是波音");}
}
/*** 空客飞机** @author Lion Li*/
public class KongKeAircraft implements IAircraft {public void name() {System.out.println("我是空客");}
}
4.定义所有产品工厂实现
/*** 宝马汽车工厂** @author Lion Li*/
public class BaoMaCarFactory implements ICarFactory {public ICar create() {return new BaoMaCar();}
}
/*** 大众汽车工厂** @author Lion Li*/
public class DaZhongCarFactory implements ICarFactory {public ICar create() {return new DaZhongCar();}
}
/*** 波音飞机工厂** @author Lion Li*/
public class BoYinAircraftFactory implements IAircraftFactory {public IAircraft create() {return new BoYinAircraft();}
}
/*** 空客飞机工厂** @author Lion Li*/
public class KongKeAircraftFactory implements IAircraftFactory {public IAircraft create() {return new KongKeAircraft();}
}
5.定义交通工具抽象工厂
/*** 交通工具抽象工厂** @author Lion Li*/
public abstract class TransportationFactory {public void init() {System.out.println("初始化数据");}protected abstract ICar createCar(Class<? extends ICarFactory> clazz);protected abstract IAircraft createAircraft(Class<? extends IAircraftFactory> clazz);
}
6.定义出行方式工厂
/*** 出行方式工厂** @author Lion Li*/
public class TravelFactory extends TransportationFactory {@Overrideprotected ICar createCar(Class<? extends ICarFactory> clazz) {super.init();if (null != clazz) {try {return clazz.newInstance().create();} catch (Exception e) {throw new RuntimeException(e);}}return null;}@Overrideprotected IAircraft createAircraft(Class<? extends IAircraftFactory> clazz) {super.init();if (null != clazz) {try {return clazz.newInstance().create();} catch (Exception e) {throw new RuntimeException(e);}}return null;}
}
7.编写测试类并运行测试
/*** @author Lion Li*/
public class Test {public static void main(String[] args){TransportationFactory factory = new TravelFactory();ICar baoma = factory.createCar(BaoMaCarFactory.class);baoma.name();ICar dazhong = factory.createCar(DaZhongCarFactory.class);dazhong.name();IAircraft boyin = factory.createAircraft(BoYinAircraftFactory.class);boyin.name();IAircraft kongke = factory.createAircraft(KongKeAircraftFactory.class);kongke.name();}}

Spring 工厂 BeanFactory 解析
这里由于网上已经有很多成熟的解析文档 就不多做介绍了
推荐文章链接: Spring 的工厂模式 BeanFactory 是什么源码刨析
相关文章:
设计模式 简单工厂 工厂方法模式 抽象工厂模式 Spring 工厂 BeanFactory 解析
工厂模式介绍 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。它是创建型模式。 简单工厂 简单工厂模式是指由一个工厂对象决定创建出哪一种产品类的实例, 但它不属于GOF 23种设计模式 简单工厂适用于工厂类负责创建的对象较少的场景,…...
【Hive_03】单行函数、聚合函数、窗口函数、自定义函数、炸裂函数
1、函数简介2、单行函数2.1 算术运算函数2.2 数值函数2.3 字符串函数(1)substring 截取字符串(2)replace 替换(3)regexp_replace 正则替换(4)regexp 正则匹配(5ÿ…...
RabbitMQ手动应答与持久化
1.SleepUtil线程睡眠工具类 package com.hong.utils;/*** Description: 线程睡眠工具类* Author: hong* Date: 2023-12-16 23:10* Version: 1.0**/ public class SleepUtil {public static void sleep(int second) {try {Thread.sleep(1000*second);} catch (InterruptedExcep…...
java使用枚举类型解决if-else大量堆积
调用代码 import com.example.javaone.kk.MyEnum;public class Gst {public static void main(String[] args) {MyEnum eMyEnum.getById(1);System.out.println(e.getGetSize());} }被调用代码 package com.example.javaone.kk; public enum MyEnum {ENUM1(1,2),ENUM2(2,3),E…...
【数据结构】八大排序之直接插入排序算法
🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.直接插入排序简介及思路 直接插入排序(Straight Insertion Sort)是一种简单直观的插入排序算法. 它的基本操作是: 将一个数据插入到已经排好的有序表中,从而得到一个新的,数…...
网络编程『socket套接字 ‖ 简易UDP网络程序』
🔭个人主页: 北 海 🛜所属专栏: Linux学习之旅、神奇的网络世界 💻操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌤️前言🌦️正文1.预备知识1.1.IP地址1.2.端口号1.3.端口号与进…...
FreeSWITCH rtp endpoint recvonly
查了下rtp.c的源码,远端端口为0就意味着recvonly,但其实不然,调用switch_rtp_new会马上返回失败 经过反复测试,增加下面几行代码之后终于变成了recvonly: tech_pvt->mode RTP_RECVONLY; rtp_flags[SWITCH_RTP_FLAG_AUTOADJ];…...
Hadoop和Spark的区别
Hadoop 表达能力有限。磁盘IO开销大,延迟度高。任务和任务之间的衔接涉及IO开销。前一个任务完成之前其他任务无法完成,难以胜任复杂、多阶段的计算任务。 Spark Spark模型是对Mapreduce模型的改进,可以说没有HDFS、Mapreduce就没有Spark。…...
英文论文降重修改技巧 papergpt
大家好,今天来聊聊英文论文降重修改技巧,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 英文论文降重修改技巧 作为网站编辑,我们经常需要处理大量…...
DevOps搭建(十)-安装Harbor镜像仓库详细步骤
1、下载Harbor 官方地址: https://goharbor.io/ 下载地址: https://github.com/goharbor/harbor/tags 选择文档版本进行下载,这里我们选择v2.7.2版本 2、上传到服务器并解压 上传压缩包到服务器后,解压到/usr/local目录下&a…...
DDA 算法
CAD 算法是计算机辅助设计的算法,几何算法是解决几何问题的算法 CAD 算法是指在计算机辅助设计软件中使用的算法,用于实现各种设计和绘图功能,CAD 广泛应用于建筑、机械、电子等领域,可以大大提高设计效率和精度 绘图算法是 CAD…...
天猫数据平台-淘宝天猫数据-天猫销售数据分析:11月天猫平台滑雪运动装备行业销量翻倍!
随着天气变冷、冬季来临,迎来了疫情后的首个滑雪季,加之自冬奥会结束以来,大众参与冰雪运动的热度持续攀升,因此,冰雪运动的需求正集中释放。 根据相关数据显示,11月以来,全国滑雪场门票预订量较…...
使用OpenCV和PIL库读取图片的区别
OpenCV 和 PIL(Pillow)是两个不同的图像处理库,它们使用不同的数据结构来表示图像。 OpenCV 格式图像: OpenCV 中的图像通常表示为 NumPy 数组。这些数组可以是多维的,例如对于彩色图像,它们是三维数组&am…...
Amazon CodeWhisperer:AI 编程助手
文章作者:prigioni 1. 什么是 Amazon CodeWhisperer? Amazon CodeWhisperer 能够理解以自然语言(英语)编写的注释,并能实时生成多条代码建议,以此提高开发人员生产力。该服务可以直接在集成开发环境&#…...
Linux 使用 Anaconda+Uwsgi 部署 Django项目和前端项目
一、安装Anaconda 使用Anaconda创建python环境的优点: virtualenv只能创建系统原有的python版本,而不能创建创建任意版本的环境 而Anaconda的虚拟环境中,你可以指定任意现存可使用的python环境(包括比原环境版本高的python版本&a…...
分析若依的文件上传处理逻辑
分析若依的文件上传处理逻辑 注:已经从若依框架完成拆分,此处单独分析一下人家精彩的封装,也来理解一下怎么做一个通用的上传接口!如有分析的,理解的不透彻的地方,大家多多包含,欢迎批评指正&am…...
Note3---初阶二叉树~~
目录 前言🍄 1.树概念及结构☎️ 1.1 树的概念🎄 1.2 树的相关概念🦜 1.2.1 部分概念的加深理解🐾 1.2.2 树与非树🪴 1.3 树的表示🎋 1.4 树在实际中的运用(表示文件系统…...
ElasticSearch学习篇8_Lucene之数据存储(Stored Field、DocValue、BKD Tree)
前言 Lucene全文检索主要分为索引、搜索两个过程,对于索引过程就是将文档磁盘存储然后按照指定格式构建索引文件,其中涉及数据存储一些压缩、数据结构设计还是很巧妙的,下面主要记录学习过程中的StoredField、DocValue以及磁盘BKD Tree的一些…...
ROS机器人入门
http://www.autolabor.com.cn/book/ROSTutorials/ 1、ROS简介 ROS 是一个适用于机器人的开源的元操作系统。其实它并不是一个真正的操作系统,其 底层的任务调度、编译、寻址等任务还是由 Linux 操作系统完成,也就是说 ROS 实际上是运 行在 Linux 上的次级…...
30. 深度学习进阶 - 池化
Hi,你好。我是茶桁。 上一节课,我们详细的学习了卷积的原理,在这个过程中给大家讲了一个比较重要的概念,叫做input channel,和output channel。 当然现在不需要直接去实现, 卷积的原理PyTorch、或者TensorFlow什么的…...
深入STM32F407 USART收发机制:用逻辑分析仪解读数据帧与中断处理流程
深入解析STM32F407 USART通信机制:从数据帧捕获到中断优化实战 在工业自动化、智能硬件等高可靠性应用场景中,串口通信的稳定性和效率往往决定着整个系统的性能边界。STM32F407作为ARM Cortex-M4内核的经典代表,其USART模块在异步通信场景下展…...
语义分割竞赛必备:5种Loss函数组合效果对比(含Dice+Focal Loss调参指南)
语义分割竞赛进阶:5种损失函数组合实战评测与调参策略 在Kaggle等数据竞赛中,语义分割任务的性能提升往往取决于损失函数的巧妙选择与组合。不同于常规分类任务,多类别像素级预测需要处理极端类别不平衡、边界模糊等独特挑战。本文将深入剖析…...
告别手动编码烦恼:用CANopenEditor高效定制CANopenNode对象字典
告别手动编码烦恼:用CANopenEditor高效定制CANopenNode对象字典 【免费下载链接】CANopenNode CANopen protocol stack 项目地址: https://gitcode.com/gh_mirrors/ca/CANopenNode 你是否曾为CANopenNode项目中繁琐的对象字典配置而头疼?手动编写…...
如何通过Vial-QMK打造专属键盘体验:从入门到精通的个性化定制指南
如何通过Vial-QMK打造专属键盘体验:从入门到精通的个性化定制指南 【免费下载链接】vial-qmk QMK fork with Vial-specific features. 项目地址: https://gitcode.com/gh_mirrors/vi/vial-qmk 在数字化时代,键盘作为人与计算机交互的核心工具&…...
为什么你的Mojo-Python FFI在M1芯片上必崩?苹果Silicon专属ABI陷阱与跨架构符号绑定修复指南(含Clang插件源码)
第一章:为什么你的Mojo-Python FFI在M1芯片上必崩?Mojo-Python FFI(Foreign Function Interface)在 Apple M1 及后续 ARM64 架构芯片上崩溃,根源并非配置疏忽,而是底层 ABI 不兼容与运行时符号解析机制的双…...
4步构建高效视频处理流水线:VideoFusion全功能指南
4步构建高效视频处理流水线:VideoFusion全功能指南 【免费下载链接】VideoFusion 一站式短视频拼接软件 无依赖,点击即用,自动去黑边,自动帧同步,自动调整分辨率,批量变更视频为横屏/竖屏 项目地址: https://gitcode.com/gh_mirrors/vi/VideoFusion 功能特性…...
收藏!2026非科班/转行小白必看:3步切入AI大模型,月薪30w+实战路径
2026年的职场赛道,AI大模型依旧是绝对的“黄金风口”。 最新行业报告显示,AI相关岗位需求逆势增长37%,薪资领跑全行业,大厂校招起薪普遍突破25k。但一个残酷的现实是: 太多非科班、半路转行的程序员,还在门…...
新手避坑指南:用DJI NAZA-LITE飞控组装F450无人机,从焊接电调到GPS校准的完整流程
新手避坑指南:用DJI NAZA-LITE飞控组装F450无人机,从焊接电调到GPS校准的完整流程 第一次组装无人机就像玩一场高风险的拼图游戏——每个零件的位置、每根接线的顺序都可能影响最终能否安全起飞。作为过来人,我清楚地记得焊接电调时锡珠飞溅的…...
手把手调参:在TMS320F28034上实现永磁电机的高功率因数控制(附代码思路)
手把手调参:在TMS320F28034上实现永磁电机的高功率因数控制(附代码思路) 当你在调试一台采用薄膜电容的永磁电机驱动器时,是否遇到过这样的困境:明明按照教科书设计了PWM波形,但实测功率因数始终卡在0.92上…...
FlowState Lab模型微调教程:使用自定义数据集训练专属波动模型
FlowState Lab模型微调教程:使用自定义数据集训练专属波动模型 1. 学习目标与前置准备 想为特定领域打造专属的波动预测模型吗?本文将带你完成从数据准备到模型评估的全流程。学完本教程,你将能够: 准备符合要求的时序/空间序列…...
