深度探索Java工厂模式:创新与灵活性的结合
在软件设计中,有效地组织对象的创建过程是至关重要的。Java工厂模式是一种优秀的设计模式,它能够在对象创建的过程中提供更大的灵活性和可扩展性。本文将深入探讨工厂模式的不同实现方式,并提供详细的代码示例,以帮助读者更好地理解和应用该模式。
1. 引言
在软件开发中,对象的创建通常是一项繁琐而又重要的任务。传统的对象创建方式可能会将对象的创建逻辑散布在各个类中,导致代码的维护和扩展变得困难。而工厂模式则能够将对象的创建过程封装起来,使得系统更加灵活、可扩展和易于维护。
2. 简单工厂模式
简单工厂模式是工厂模式中最基础的一种形式。在简单工厂模式中,我们通过一个工厂类来创建对象,根据传入的参数来决定创建哪种类型的对象。下面是一个简单的示例:
// 产品接口
interface Product {void display();
}// 具体产品A
class ConcreteProductA implements Product {public void display() {System.out.println("This is product A.");}
}// 具体产品B
class ConcreteProductB implements Product {public void display() {System.out.println("This is product B.");}
}// 简单工厂
class SimpleFactory {public static Product createProduct(String type) {if (type.equals("A")) {return new ConcreteProductA();} else if (type.equals("B")) {return new ConcreteProductB();}return null;}
}
在简单工厂模式中,我们只需要关注一个工厂类
SimpleFactory,通过调用其静态方法createProduct来创建产品对象。但是,简单工厂模式的缺点在于每次新增产品都需要修改工厂类,违反了开闭原则。
开闭原则要求一个软件实体(类、模块、函数等)应该对扩展开放(Open for Extension),对修改关闭(Closed for Modification)。换句话说,当需要改变一个已有的系统的行为时,不应该去修改原有的代码,而是应该通过扩展来实现新的功能。
开闭原则的核心思想是通过抽象和多态来实现系统的可扩展性。通过定义抽象的接口或基类,我们可以在不修改现有代码的情况下引入新的实现,从而实现系统的功能扩展。这样做的好处是可以尽量减少对现有代码的修改,降低引入新错误的风险,同时提高代码的可维护性和可复用性。
3. 工厂方法模式
工厂方法模式是对简单工厂模式的改进,它将工厂类抽象成一个接口,每个具体的产品都有对应的工厂类来创建。这样,每次新增产品只需要新增一个工厂类,不需要修改已有的代码。下面是一个工厂方法模式的示例:
// 工厂接口
interface Factory {Product createProduct();
}// 具体工厂A
class ConcreteFactoryA implements Factory {public Product createProduct() {return new ConcreteProductA();}
}// 具体工厂B
class ConcreteFactoryB implements Factory {public Product createProduct() {return new ConcreteProductB();}
}
在工厂方法模式中,我们定义了一个工厂接口 Factory,每个具体的产品都有对应的工厂类来实现该接口。这样,新增产品只需要新增一个具体的工厂类即可。
缺点是:容易造成类的数量过多,增加系统的复杂度
4. 抽象工厂模式
抽象工厂模式是工厂模式中最复杂的一种形式,它能够支持创建一组相关或相互依赖的对象。在抽象工厂模式中,我们定义了一个抽象工厂接口,每个具体的工厂类都负责创建一组产品。下面是一个抽象工厂模式的示例:
// 抽象工厂接口
interface AbstractFactory {Product createProductA();Product createProductB();
}// 具体工厂A
class ConcreteFactoryA implements AbstractFactory {public Product createProductA() {return new ConcreteProductA();}public Product createProductB() {return new ConcreteProductB();}
}// 具体工厂B
class ConcreteFactoryB implements AbstractFactory {public Product createProductA() {return new ConcreteProductA();}public Product createProductB() {return new ConcreteProductB();}
}
在抽象工厂模式中,我们定义了一个抽象工厂接口 AbstractFactory,每个具体的工厂类都实现了该接口,并负责创建一组产品。这样,我们可以根据实际情况选择不同的工厂来创建不同的产品组合。
5. 应用场景
工厂模式在实际应用中有着广泛的应用场景,特别是在需要大量创建对象,并且对象的创建过程比较复杂时,工厂模式能够发挥其优势。例如,图形界面开发中的控件创建、数据库访问中的连接池管理等都可以使用工厂模式来进行设计和实现。
6. 总结
工厂模式是一种非常重要的设计模式,它能够有效地将对象的创建过程封装起来,提高系统的灵活性、可扩展性和可维护性。不同的工厂模式适用于不同的场景,我们可以根据实际需求选择合适的工厂模式来设计和实现我们的系统。
在本文中,我们深入探讨了简单工厂、工厂方法和抽象工厂三种工厂模式的实现方式,并提供了详细的代码示例。通过学习和应用工厂模式,我们能够更好地管理对象的创建过程,使得系统更加灵活和可扩展。
相关文章:
深度探索Java工厂模式:创新与灵活性的结合
在软件设计中,有效地组织对象的创建过程是至关重要的。Java工厂模式是一种优秀的设计模式,它能够在对象创建的过程中提供更大的灵活性和可扩展性。本文将深入探讨工厂模式的不同实现方式,并提供详细的代码示例,以帮助读者更好地理…...
delphi6直连redis服务(用lua脚本redis模块)
一、创建一个exe程序 创建一个exe程序,引用LuaRedis.pas单元(此单元自己封装的代码,目前主要封装了获取key和设置key/value功能),代码如下: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variant…...
嵌入式Linux:编译和使用Protobuf库
目录 1、开发环境和工具 2、安装和编译Protobuf、Protobuf-C库 3、编写和编译proto文件 4、修改makefile文件 5、测试示例 6、参考资料 Protobuf(Protocol Buffers)是由 Google 开发的一种轻量级、高效的结构化数据序列化方式,用于在不同应用…...
导航app为什么知道还有几秒变绿灯?
在使用地图导航app行驶至信号灯的交叉路口时,这些应用程序会贴心地告知用户距信号灯变化还有多少秒,无论是即将转为绿灯还是红灯。这一智能化提示不仅使得驾驶员能适时做好起步或刹车的准备,有效缓解了因等待时间不确定而产生的焦虑情绪&…...
设计模式 六大原则之单一职责原则
文章目录 概述代码例子小结 概述 先看下定义吧,如下: 单一职责原则的定义描述非常简单,也不难理解。一个类只负责完成一个职责或者功能。也就是说在类的设计中, 我们不要设计大而全的类,而是要设计粒度小、功能单一的类。 代码例…...
DOM重点核心(注册事件+DOM事件流)
目录 1.注册事件 注册时间概述 addEventListener() 删除事件 2.DOM事件流 DOM事件流理论 事件对象 事件对象的常见属性和方法 e.targe 和 this的区别 阻止默认行为 阻止冒泡 事件委托 禁止右键菜单和禁止选中文字 获得鼠标的坐标(可视区、页面、浏览器…...
浅谈操作系统中的重要概念——线程(3)——设计模式
文章目录 一、什么是设计模式?二、单例模式2.1、饿汉模式2.2、懒汉模式2.3、多线程情况下调用 饿汉模式与懒汉模式 谁是安全的??(重点) 三、工厂模式3.1、什么是工厂模式?3.1.1、构造方法存在的缺陷3.1.1.1…...
nginx配置域名与IP访问服务冲突问题
在最近的一次开发中遇到一个问题,我在云服务器上部署了两个服务,A服务和B服务, A服务在服务器中用的端口是80端口,所以我在浏览器访问的地址就是 B服务在服务器中用的是9818端口,所以我在浏览器访问的是 现在我给B服务…...
2024OD机试卷-字符串序列判定 (java\python\c++)
题目:字符串序列判定 题目描述 输入两个字符串 S 和 L ,都只包含英文小写字母。S长度 ≤ 100,L长度 ≤ 500,000。判定S是否是L的有效子串。 判定规则:S 中的每个字符在 L 中都能找到(可以不连续),且 S 在L中字符的前后顺序与 S 中顺序要保持一致。(例如,S = ” ace…...
7-128 最长公共子串
一个序列中去掉若干(也可以不去掉)元素剩下的部分称为其子序列。对于给定的序列X = <x1,x2,…,xm>,称序列Z = <z1,z2,…,zk>为X的一个子序列,仅当在X中存在一个递增序号序列<i1,i2,…,ik>,对所有的j(1,2,…,k)满足 xij…...
【瑞萨RA6M3】2. UART 实验
https://blog.csdn.net/qq_35181236/article/details/132789258 使用 uart9 配置 打印 void hal_entry(void) {/* TODO: add your own code here */fsp_err_t err;uint8_t c;/* 配置串口 */err g_uart9.p_api->open(g_uart9.p_ctrl, g_uart9.p_cfg);while (1){g_uart9.…...
js遇到需要正则匹配来修改img标签+清除行内样式
方法一 var regex0 new RegExp("(i?)(\<img)([^\>]\>)", "gmi") //正则匹配表达式this.newcontent this.content.replace(regex0,"$2 styledisplay:block;margin: auto;width:120px; $3") //下面这个则需要在$2 $3左右添加和修改东…...
Vue学习v-if与v-else-if
Vue学习v-if与v-else-if 一、前言1、v-if2、v-else-if3、v-else4、示例 一、前言 v-if 和 v-else-if 是 Vue.js 中用于条件渲染的指令,它们通常与 v-else 一起使用。下面我来详细解释一下它们的用法和区别: 1、v-if 用法:v-if 是一个指令&…...
linux进阶高级配置,你需要知道的有哪些2-firewalld防火墙(一)
1、防火墙的技术上分类: 包过滤:firewalld属于这种 应用代理: 状态检测:ASA 2、firewalld的两种配置模式: 运行时配置 :立即生效 永久配置:重新加载服务生效 3、常用的区域: trust…...
Centos 中如何汉化man命令
刚学Linux,记不住命令和选项,很依赖里面的 man 查看命令,但因为着实看不懂,有没有什么办法把man查看命令的信息改成中文 在CentOS 7中,你可以通过安装man-pages-zh包来获取中文的man手册。以下是具体的步骤:…...
原生小程序开发如何使用 tailwindcss
原生小程序开发如何使用 tailwindcss 原生小程序开发如何使用 tailwindcss 前言什么是 weapp-tailwindcss ?0. 准备环境以及小程序项目1. 安装与配置 tailwindcss 0. 使用包管理器安装 tailwindcss1. 在项目目录下创建 postcss.config.js 并注册 tailwindcss2. 配置 tailwind…...
spring alibaba中的seata分布式事务
Seata AT 模式设计思路 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。 核心在于对业务sql进行解决解析,转换成undolog,并同时入库存 二阶段: 提交异步化,非常快速地完成…...
MQTT学习(二)
订阅主题和订阅确认 SUBSCRIBE——订阅主题 之前的CONNECT报文,分为 固定报头:必须存在,用于描述报文信息。里面有指出什么类型的报文,报文的等级。可变报头:不一定存在。主要看什么样子类型的报文。有效载荷部分&a…...
入职Java,不会git被开除了。。。
入职Java,不会git被开除了。。。 文章目录 入职Java,不会git被开除了。。。前言一、Git是什么?二、Git的核心概念三、Git的工作流程四、Git的常用命令五、总结 🌈你好呀!我是 山顶风景独好 💝欢迎来到我的博…...
Mysql 隔离级别
MySQL的事务隔离级别是指在处理并发事务时,为保证数据的一致性和事务的独立性,数据库系统提供的不同级别控制策略。根据ACID特性中的隔离性(Isolation),MySQL支持四种标准的事务隔离级别,每种级别有不同的并…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...
