【设计模式】之工厂模式
工厂模式
1.介绍
工厂模式(创建型模式),是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式;
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
工厂模式是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式;虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。(选择不同的接口,实例化不同的工厂对象)
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:创建过程在其子类执行。
应用实例:
- 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
- Hibernate 换数据库只需换方言和驱动就可以。
优点:
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
每次增加一个产品时,都需要在工厂中增加一个具体类和对象,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
使用场景:
- 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
- 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
- 设计一个连接服务器的框架,需要三个协议,
"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。
有一点需要注意的地方就是:
- 复杂对象适合使用工厂模式;
- 而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
2.具体步骤(实现代码)
- 创建接口,定义方法;
- 子类实现接口,重写方法;
- 创建工厂,生产用户需要的实体类对象;
- 使用工厂,获取实体类,执行该类的方法等;
步骤1:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类;创建过程在其子类执行
/*** 步骤一:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类;* 创建过程在其子类执行**/
//定义一个形状接口
public interface Shape {//定义画形状的方法void draw();
}
步骤2:定义实现接口的实体类
/*** 步骤2:定义实现接口的实体类*/
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("画圆形的子类");}
}
/*** 步骤2:定义实现接口的实体类*/
public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("画长方形的子类");}
}
/*** 步骤2:定义实现接口的实体类*/
public class Square implements Shape {@Overridepublic void draw() {System.out.println("画正方形的子类");}
}
步骤3:创建一个工厂,生成基于给定信息的实体类的对象。
/*** 步骤3:创建一个工厂,生成基于给定信息的实体类的对象。*/
public class ShapeFactory {//使用getShape获取形状类型的对象public Shape getShape(String shapeType) {if (shapeType == null) {return null;}//equalsIgnoreCase()不考虑大小写if (shapeType.equalsIgnoreCase("circle")) {return new Circle();} else if (shapeType.equalsIgnoreCase("square")) {return new Square();} else if (shapeType.equalsIgnoreCase("rectangle")) {return new Rectangle();}return null;}
}
步骤4:使用工厂,通过用户传递信息获取实体类的对象
public class TestMain {public static void main(String[] args) throws IOException {//用户输入BufferedReader buff = new BufferedReader(new InputStreamReader(System.in));String str = buff.readLine();//创建工厂对象ShapeFactory shapeFactory=new ShapeFactory();//通过工厂对象获取实体类的对象Shape shape1=shapeFactory.getShape(str);//执行某个实体类的方法shape1.draw();}
}
相关文章:
【设计模式】之工厂模式
工厂模式 1.介绍 工厂模式(创建型模式),是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式;在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的…...
70.爬楼梯
题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意: 给定 n 是一个正整数。 示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶…...
【论文解读】ICLR 2024高分作:ViT需要寄存器
来源:投稿 作者:橡皮 编辑:学姐 论文链接:https://arxiv.org/abs/2309.16588 摘要: Transformer最近已成为学习视觉表示的强大工具。在本文中,我们识别并表征监督和自监督 ViT 网络的特征图中的伪影。这些…...
【Redis】AOF 基础
因为 Redis AOF 的实现有些绕, 就分成 2 篇进行分析, 本篇主要是介绍一下 AOF 的一些特性和依赖的其他函数的逻辑,为下一篇 (Redis AOF 源码) 源码分析做一些铺垫。 AOF 全称: Append Only File, 是 Redis 提供了一种数据保存模式, Redis 默认不开启。 AOF 采用日志的形式来记…...
C语言—每日选择题—Day50
一天一天的更新,也是达到50天了,精选的题有250道,博主累计做了不下500道选择题,最喜欢的题型就是指针和数组之间的计算呀,不知道关注我的小伙伴是不是一直在坚持呢?文末有投票,大家可以投票让博…...
[C/C++]——内存管理
学习C/C的内存管理 前言:一、C/C的内存分布二、C语言中动态内存管理方式三、C中动态内存管理方式3.1、new/delete操作符3.1.2、new/delete操作内置类型3.1.3、new/delete操作自定义类型 3.2、认识operator new和operator delete函数3.3、了解new和delete的实现原理3…...
PDF文件的限制编辑,如何设置?
想要给PDF文件设置一个密码防止他人对文件进行编辑,那么我们可以对PDF文件设置限制编辑,设置方法很简单,我们在PDF编辑器中点击文件 – 属性 – 安全,在权限下拉框中选中【密码保护】 然后在密码保护界面中,我们勾选【…...
Linux 中使用 docker 安装 Elasticsearch 及 Kibana
Linux 中使用 docker 安装 Elasticsearch 及 Kibana 安装 Elasticsearch 和 Kibana安装分词插件 ik_smart 安装 Elasticsearch 和 Kibana 查看当前运行的镜像及本地已经下载的镜像,确认之前没有安装过 ES 和 Kibana 镜像 docker ps docker images从远程镜像仓库拉…...
在Flutter中使用PhotoViewGallery指南
介绍 Flutter中的PhotoViewGallery是一个功能强大的插件,用于在应用中展示可缩放的图片。无论是构建图像浏览器、相册应用,还是需要在应用中查看大图的场景,PhotoViewGallery都是一个不错的选择。 添加依赖 首先,需要在pubspec…...
c语言中的static静态(1)static修饰局部变量
#include<stdio.h> void test() {static int i 1;i;printf("%d ", i); } int main() {int j 0;while (j < 5){test();j j 1;}return 0; } 在上面的代码中,static修饰局部变量。 当用static定义一个局部变量后,这时局部变量就是…...
生信算法4 - 获取overlap序列索引和序列的算法
生信序列基本操作算法 建议在Jupyter实践,python版本3.9 1. 获取overlap序列索引和序列的算法实现 # min_length 最小overlap碱基数量3个 def getOverlapIndexAndSequence(a, b, min_length3):""" Return length of longest suffix of a matching…...
springboot 学习网站
Spring Boot 系列教程https://www.docs4dev.com/ Spring Boot 教程汇总 http://www.springboot.wiki/ Spring Cloud 微服务教程 http://www.springboot.wiki/ 1、自定义banner https://www.cnblogs.com/cc11001100/p/7456145.html 2、事件和监听器 https://blog.csd…...
论文笔记:A review on multi-label learning
一、介绍 传统的监督学习是单标签学习,但是现实中一个实例可能对应多个标签。这篇文章介绍了多标签分类的定义和评价指标、多标签学习的算法还有其他相关的任务。 二、问题相关定义 2.1 多标签学习任务 假设 X R d X R^d XRd,表示d维的输入空间&am…...
接口文档 YAPI介绍
YAPI介绍 YAPI使用流程...
LeetCode 300最长递增子序列 674最长连续递增序列 718最长重复子数组 | 代码随想录25期训练营day52
动态规划算法10 LeetCode 300 最长递增子序列 2023.12.15 题目链接代码随想录讲解[链接] int lengthOfLIS(vector<int>& nums) {//创建变量result存储最终答案,设默认值为1int result 1;//1确定dp数组,dp[i]表示以nums[i]为结尾的子数组的最长长度ve…...
Improving IP Geolocation with Target-Centric IP Graph (Student Abstract)
ABSTRACT 准确的IP地理定位对于位置感知的应用程序是必不可少的。虽然基于以路由器为中心(router-centric )的IP图的最新进展被认为是前沿的,但一个挑战仍然存在:稀疏IP图的流行(14.24%,少于10个节点,9.73%孤立)限制了图的学习。为了缓解这个问题,我们将目标主机(ta…...
华为技面三轮面试题
1. 最长回文子串 -- 中心扩散法 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s "babad" 输出:"bab" 解释&…...
Linux arm架构下构建Electron安装包
上篇文章我们介绍 Electron 基本的运行开发与 windows 安装包构建简单流程,这篇文章我们从零到一构建 Linux arm 架构下安装包,实际上 Linux arm 的构建流程,同样适用于 Linux x86 环境,只不过需要各自的环境依赖,Linu…...
【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 NLP 部分
【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 NLP 部分 概述NLP 简介文本处理词嵌入上下文理解 文本数据加载to_device 函数构造数据加载样本数量 len获取样本 getitem 分词构造函数调用函数轮次嵌入 RobertaRoberta 创新点NSP (Next Sentence Prediction…...
推免那些事
平生第一次搞推免,也是最后一次。错失了一些机会,也有幸获得了一些机会,值得祝庆,也值得反思。 以下记录为个人流水账。 个人背景 我的背景可以算不是非常好了,况且今年211受歧视比较严重。 学校:211&…...
Android Hook应用开发实战:从入门到精通LSPosed框架
Android Hook应用开发实战:从入门到精通LSPosed框架 【免费下载链接】LSPosed_mod My changes to LSPosed 项目地址: https://gitcode.com/GitHub_Trending/ls/LSPosed_mod 一、技术背景:为什么需要Android钩子技术 理解钩子技术的核心价值 钩子…...
Phi-3 Forest Laboratory 数学公式处理:集成MathType逻辑的LaTeX代码生成
Phi-3 Forest Laboratory 数学公式处理:集成MathType逻辑的LaTeX代码生成 你是不是也遇到过这样的场景?写论文或者做笔记时,需要插入一个复杂的数学公式,比如那个让人头疼的“二元二次方程的求根公式”。你打开LaTeX编辑器&#…...
Pixel Mind Decoder 前端交互设计:基于 JavaScript 的情绪看板开发
Pixel Mind Decoder 前端交互设计:基于 JavaScript 的情绪看板开发 1. 情绪看板的应用场景与价值 在现代数字化产品中,理解用户情绪变得越来越重要。无论是社交媒体监测、客服系统优化,还是心理健康应用开发,能够实时分析并可视…...
关于【进程池阻塞 + 子进程未回收问题】
续接上文:进程间通信(二):实现一个高可用的进程池-CSDN博客 目录 一、先看现象:两个核心问题 二、核心原因:文件描述符泄漏(管道读端没关干净) 1. 管道的核心规则回顾 2. 后果&a…...
PMSM无感控制中滑模观测器的相位补偿与抖振优化
1. 滑模观测器在PMSM无感控制中的核心作用 永磁同步电机(PMSM)的无位置传感器控制技术中,滑模观测器(SMO)扮演着关键角色。这种控制方式不需要物理位置传感器,而是通过算法实时估算转子位置和速度。我在实…...
告别抢票焦虑:用Python自动化脚本轻松获取大麦网演唱会门票
告别抢票焦虑:用Python自动化脚本轻松获取大麦网演唱会门票 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还在为心仪的演唱会门票秒光而烦恼吗?DamaiHelper大麦网抢票脚…...
SiameseUIE在CSDN社区的应用:技术文章智能分析
SiameseUIE在CSDN社区的应用:技术文章智能分析 1. 引言 CSDN社区每天都有成千上万的技术文章发布,涵盖了从编程语言到人工智能的各个领域。面对如此庞大的内容量,如何快速准确地理解每篇文章的核心内容、自动生成标签、进行智能分类&#x…...
OpenClaw故障自愈方案:百川2-13B模型异常日志分析与重试机制
OpenClaw故障自愈方案:百川2-13B模型异常日志分析与重试机制 1. 问题背景与需求场景 上周我在用OpenClaw对接百川2-13B模型处理夜间自动化任务时,遇到了一个典型问题:凌晨3点突然收到飞书告警,显示"模型响应超时"。当…...
如何用开源OCR突破效率瓶颈?Umi-OCR三大核心优势深度解析
如何用开源OCR突破效率瓶颈?Umi-OCR三大核心优势深度解析 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件,适用于Windows系统,支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode.com/G…...
技术破局:B端拓客号码核验的痛点突围与行业新生态,氪迹科技法人股东 核验筛选系统,阶梯式价格
在B端拓客进入“精准致胜”的新时代,线索质量直接决定拓客成效,而号码核验作为筛选有效线索的“第一道门槛”,其服务水平直接影响拓客团队的投入回报与运营效率。当下,随着AI拓客技术的普及,号码核验已渗透到电销、金融…...
