23种设计模式之工厂方法模式
文章目录
- 1. 简介
- 2. 代码
- 2.1 抽象类:Course.java
- 2.2 产品A:JavaCourse.java
- 2.3 产品B:PythonCourse.java
- 2.4 工厂抽象类:CourseFactory.java
- 2.5 产品A的工厂A:JavaCourseFactory.java
- 2.6 产品B的工厂B:PyCourseFactory.java
- 2.7 测试:Test.java
- 3. 总结
- 4. 参考链接(无)
1. 简介
工厂模式是简单工厂模式的延伸,符合开闭原则的基础上,还可以在增加新的具体产品对象时不需要对已有系统做任何修改。
定义一个接口或一个抽象的工厂类,让它实现(工厂)来创建哪一个实例对象。
根据每个工厂不同的方法,来产生不同的所需要的对象。
- 解耦。把对象的创建和使用的过程分开。就是Class A 想调用 Class B,那么A只是调用B的方法,不需要管B的实例化或者不感知B如何实例化,创建的工作交给工厂类。
- 代码复用。如果创建对象B的过程需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。把创建对象B的代码放到工厂里统一管理。既减少重复代码,也方便以后对B的创建过程的修改和维护
- 符合迪米特法则和单一职责,使用者只需要知道如何使用以及负责如何用,无须感知创建的逻辑。
缺点:
- 添加新产品会增加具体工厂类和具体产品类,这无疑会增加系统的复杂度,带来更多的开销。。。

2. 代码
2.1 抽象类:Course.java
public abstract class Course{public abstract void make();
}
2.2 产品A:JavaCourse.java
public class JavaCourse extends Course {@Overridepublic void make() {System.out.println("制作java课程");}
}
2.3 产品B:PythonCourse.java
public class PythonCourse extends Course{@Overridepublic void make() {System.out.println("制作python课程");}
}
2.4 工厂抽象类:CourseFactory.java
public abstract class CourseFactory {public abstract Course getCourse();
}
2.5 产品A的工厂A:JavaCourseFactory.java
public class JavaCourseFactory extends CourseFactory {@Overridepublic Course getCourse() {return new JavaCourse();}
}
2.6 产品B的工厂B:PyCourseFactory.java
public class PyCourseFactory extends CourseFactory {@Overridepublic Course getCourse() {return new PythonCourse();}
}
2.7 测试:Test.java
public class Test {public static void main(String[] args) {JavaCourseFactory javaFactory = new JavaCourseFactory();Course javaCourse = javaFactory.getCourse();javaCourse.make();PyCourseFactory pythonFactory = new PyCourseFactory();Course pythonCourse = pythonFactory.getCourse();pythonCourse.make();}
}
运行结果:
制作java课程
制作python课程
3. 总结
BeanFactory就是使用的这个模式,org.springframework.beans.factory.BeanFactory(version:5.0.5)
这里就不进行更多说明了,想知道更多,自己去看源码。
4. 参考链接(无)
相关文章:
23种设计模式之工厂方法模式
文章目录 1. 简介2. 代码2.1 抽象类:Course.java2.2 产品A:JavaCourse.java2.3 产品B:PythonCourse.java2.4 工厂抽象类:CourseFactory.java2.5 产品A的工厂A:JavaCourseFactory.java2.6 产品B的工厂B:PyCo…...
Redis——事务
文章目录 Redis 事务Redis 的事务和 MySQL 事务的区别:事务操作MULTIEXECDISCARDWATCHUNWATCHwatch的实现原理 总结 Redis 事务 什么是事务 Redis 的事务和 MySQL 的事务 概念上是类似的. 都是把⼀系列操作绑定成⼀组. 让这⼀组能够批量执行 Redis 的事务和 MySQL 事务的区别:…...
Redis非关系型数据库操作命令大全
以下是 Redis 的常用操作命令大全,涵盖了键值操作、字符串、哈希、列表、集合、有序集合、发布/订阅、事务等多个方面的操作。 1. 通用键命令 命令说明SET key value设置指定 key 的值GET key获取指定 key 的值DEL key删除指定的 keyEXISTS key检查 key 是否存在E…...
基于SpringBoot+Vue+uniapp微信小程序的澡堂预订的微信小程序的详细设计和实现
项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…...
Linux mips架构链接库函数调用plt表汇编代码分析
linux调用共享库中的函数时通过plt表和got表实现位置无关代码,过程中涉及到lazy binding,即在第一调用外部函数时解析被调用的函数地址并将地址写入到got表,后续调用则不需要解析函数地址。这一部分和硬件架构有关,具体的是和cpu指…...
python 作业1
任务1: python为主的工作是很少的 学习的python的优势在于制作工具,制作合适的工具可以提高我们在工作中的工作效率的工具 提高我们的竞争优势。 任务2: 不换行 换行 任务3: 安装pycharm 进入相应网站Download PyCharm: The Python IDE for data science and we…...
Apache 出现 “403 forbidden“ 排查方法
1、检查运行 Apache 进程的用户没有对目录具备读取权限 如果该用户没有对 Directory 指定的目录具备适当的读取权限,就会导致 403 错误。 例如:使用用户apache启动Apache进程,但是apache用户对 Directory 指定的目录没有读取权限 2、检查…...
vue video播放m3u8监控视频
很关键的问题 vite创建的项目不需要import ‘videojs-contrib-hls’ 导入就报错 直接添加如下代码即可 html5: {vhs: {overrideNative: true},nativeVideoTracks: false,nativeAudioTracks: false,nativeTextTracks: false} 下面是完整组件示例 <template><div>…...
uniapp 获取签名证书 SHA1 自有证书签名打包
1.登录你的Dcloud 账户 2.找到我的应用菜单 3.点开某个应用 4.查看证书详情,里面有SHA1 和别名,密码,下载证书用于云打包,可以选择自有证书,输入别名,密码打包...
Open3d开发点云标注工具问题总结(二)
前面我们介绍了使用AABB方式来框选点云,但这种方式还是不够直观,我们的构想是设计一个和o3d.visualization.VisualizerWithEditing的点云框选方法一样的软件,因此,博主想到利用投影的形式进行解决: 具体的,…...
【FreeRTOS】
报错: 使用STM32cubemx自动生成freertos选项V2报错,V1不报错 …/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_os2.h(31): 解决 修改cubemx配置,将V1.8.6改选为V1.8.5后编译不再报错...
洛谷 P4995:跳跳! ← 贪心算法
【题目来源】https://www.luogu.com.cn/problem/P4995【题目描述】你是一只小跳蛙,你特别擅长在各种地方跳来跳去。 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 i 块的石头高度为 hi,地…...
代理 IP 在 AI 爬虫中的关键应用
现如今,人工智能(AI)的发展日新月异,而数据作为驱动 AI 发展的关键要素,其重要性不言而喻。AI 爬虫作为获取大量数据的重要工具,在数据收集过程中发挥着至关重要的作用。而代理 IP 在 AI 爬虫中有着广泛而重…...
【Vercel】Vercel静态部署踩坑
背景 在现代的软件开发中,自动化部署是一个不可或缺的环节。Vercel作为一个流行的前端部署平台,提供了与GitHub的无缝集成,使得开发者能够在每次提交代码后自动触发部署流程。然而,自动化部署过程中可能会遇到一些挑战࿰…...
【Spring】关于Spring中aware相关接口的作用
Aware 接口的回调方法是在 Bean 实例化之后调用的。具体来说,这些回调方法是在依赖注入完成后,但在 Bean 完全初始化之前调用的。这是 Spring 容器管理 Bean 生命周期的一部分 完成了属性赋值之后,Spring会执行一些回调,包括&…...
动态内存管理及RAII的简单应用
目录 一.程序启动所关联的内存分区 二.动态内存的申请和释放 三.将RAII思想融入代码 四.RAII思想的简单应用 一.程序启动所关联的内存分区 .dll文件是Dynamic Link Library(动态链接库)文件的缩写,它是一种共享库文件,包含…...
7、Vue2(一)
1.认识Vue 官网地址:https://v2.cn.vuejs.org/v2/guide/ Vue.js 是一套构建用户界面的渐进式框架。 Vue 2 是在2016年发布使用,2020是 vue3 才刚发布,时隔一年左右就已经将 vue3 作为了默认版本 尤雨溪,Vue.js和Vite的作者&…...
Chapter11
11.3 #include <stdio.h> #include <string.h> #define NUM_STUDENTS 40 #define NUM_SUBJECTS 3 // 学生结构体 typedef struct { int id; char name[50]; float scores[NUM_SUBJECTS]; float average; } Student; void inputData(Student studen…...
LLAMA2入门(一)-----预训练
Llama 2 是预训练和微调的LLM系列,Llama 2 和 Llama 2-Chat 模型的参数规模达到 70B。Llama 2-Chat 模型专门为对话场景进行了优化。 这是一个系列的文章,会分别从LLAMA2的预训练,微调,安全性等方面进行讲解。 1.数据来源 数据…...
使用poi-tl动态写入目录更新问题解决
在使用poi-tl动态写完word后,是无法更新目录的,使用poi-tl提供的插件也是不行的,而且很多使用poi手动写入的也是不行,最多就是让你在打开文件时提示你更新目录/更新域,用户体验很差,要点击好几次而且wps还不…...
OpenClaw配置优化:千问3.5-9B长任务稳定性提升50%
OpenClaw配置优化:千问3.5-9B长任务稳定性提升50% 1. 问题背景与挑战 去年11月接手一个自动化内容处理项目时,我第一次遭遇OpenClaw长任务执行的"断链"问题。当时需要连续完成"爬取网页→提取关键数据→生成报告→邮件发送"四个步…...
智能体学习9——CrewAI-Agent与Task核心方法详解
文章目录 CrewAI Agent 与 Task 核心方法详解 一、Agent() — 定义智能体 1.1 完整参数表 1.2 核心三要素 1.3 双模型策略 1.4 常见配置模板 1.5 直接调用(不经过 Crew) 二、Task() — 定义任务 2.1 完整参数表 2.2 参数详解 2.3 context 参数(关键) 2.4 完整使用示例 三、…...
C# WinForm 系统参数设置功能完整实现
在工业上位机、客户端工具开发中,系统参数配置是必备基础功能。本文用一套完整可运行的代码,带你实现 WinForm INI 配置文件的参数设置:自动生成配置、读取加载、界面编辑、保存生效,全程逻辑清晰、注释详细,可直接落…...
002、零基础搭建你的第一个AI开发环境
昨天帮隔壁组实习生看代码,小伙子对着屏幕发愁:“环境都跑不起来,一训练就报cuda版本不匹配。”我凑过去一看,好家伙,系统里装了三个Python版本,conda环境混着pip装,torch版本和cuda差了两位小数…...
打造行业大模型更好还是做垂直 Agent 更好
打造行业大模型更好还是做垂直 Agent 更好?从小学生的糖果王国管理谈起,拆解AI落地的终极选择题关键词:行业大模型、垂直 Agent、AI落地、通用 vs 垂直、能力边界、ROI模型、端云协同、大模型Agent架构摘要:这篇文章从「小学生管理…...
IGBT驱动电路设计避坑指南:从选型到PCB布局的8个关键点
IGBT驱动电路设计避坑指南:从选型到PCB布局的8个关键点 在电力电子领域,IGBT驱动电路的设计质量直接决定了整个系统的可靠性和效率。我曾亲眼见过一个价值百万的变频器项目,因为驱动电阻选型不当导致批量烧毁,团队不得不连续加班三…...
拆解Clonezilla镜像:除了partclone,你还需要知道的底层原理与工具链
拆解Clonezilla镜像:从分卷压缩到文件系统的技术全景解析 当我们需要从Clonezilla备份中提取单个文件时,传统方法往往要求完整恢复整个镜像——这种"全有或全无"的方式在存储资源有限的情况下显得尤为笨重。本文将带您深入Clonezilla镜像的底层…...
保姆级教程:在Jetson Orin上从零搭建DJI OSDK + ROS2 Humble开发环境(避坑指南)
保姆级教程:在Jetson Orin上从零搭建DJI OSDK ROS2 Humble开发环境(避坑指南) 当无人机遇上边缘计算,Jetson Orin与ROS2的组合正在重新定义自主飞行系统的开发范式。作为大疆生态中最硬核的开发方式,OSDK允许开发者直…...
云原生环境中的DevOps实践
云原生环境中的DevOps实践 🔥 硬核开场 各位技术老铁,今天咱们聊聊云原生环境中的DevOps实践。别跟我扯那些理论,直接上干货!在云原生时代,DevOps已经不是可选选项,而是必须掌握的生存技能。不搞DevOps&…...
claw-code 源码详细分析:Parity Audit——如何用工程对比把「像不像」从口水战变成可重复报告?
涉及源码:src/parity_audit.py、src/reference_data/archive_surface_snapshot.json、commands_snapshot.json、tools_snapshot.json,src/main.py,tests/test_porting_workspace.py。1. 要解决什么问题 大型移植里,「我们已经很像…...
