Java工厂模式详解:方法工厂模式与抽象工厂模式
Java工厂模式详解:方法工厂模式与抽象工厂模式
一、引言
在Java开发中,设计模式是解决常见软件设计问题的一种有效方式。工厂模式作为创建型设计模式的一种,提供了灵活的对象创建机制,有助于降低代码的耦合度,提高系统的可维护性和可扩展性。本文将详细介绍Java中的方法工厂模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)。
二、方法工厂模式
2.1 定义
方法工厂模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行。
2.2 结构
方法工厂模式主要包含以下几个角色:
- 抽象工厂角色(Creator):声明了工厂方法,用于返回一个产品对象。
- 具体工厂角色(Concrete Creator):实现了抽象工厂角色中的工厂方法,用于返回一个具体的产品对象。
- 抽象产品角色(Product):定义了产品的接口,是工厂方法所创建对象的超类型,也就是产品对象的共同接口。
- 具体产品角色(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂角色创建,客户端通过抽象产品角色使用具体产品。
2.3 优点
- 可扩展性:当需要增加新的产品时,只需要增加相应的具体产品类和具体工厂类,无需修改现有代码。
- 解耦:将产品的创建与使用分离,客户端只需要知道产品接口,而无需知道具体产品的类名。
2.4 缺点
- 增加类的数量:每增加一个产品,都需要增加一个具体产品类和一个具体工厂类,增加了系统的复杂性。
2.5 代码示例
// 抽象产品角色
public interface Product {void doSomething();
}// 具体产品A
public class ProductA implements Product {@Overridepublic void doSomething() {System.out.println("A do Something");}
}// 具体产品B
public class ProductB implements Product {@Overridepublic void doSomething() {System.out.println("B do Something");}
}// 抽象工厂角色
public abstract class Factory {abstract Product create();
}// 具体工厂A
public class FactoryA extends Factory {@OverrideProduct create() {return new ProductA();}
}// 具体工厂B
public class FactoryB extends Factory {@OverrideProduct create() {return new ProductB();}
}// 客户端代码
public class Client {public static void main(String[] args) {Factory factory = new FactoryA();Product product = factory.create();product.doSomething();factory = new FactoryB();product = factory.create();product.doSomething();}
}
三、抽象工厂模式
3.1 定义
抽象工厂模式(Abstract Factory Pattern)提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
3.2 结构
抽象工厂模式主要包含以下几个角色:
- 抽象工厂角色(Abstract Factory):声明了一组用于创建产品的抽象方法。
- 具体工厂角色(Concrete Factory):实现了抽象工厂角色中的抽象方法,用于创建具体的产品对象。
- 抽象产品角色(Abstract Product):定义了产品的接口,是工厂方法所创建对象的超类型。
- 具体产品角色(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂角色创建。
3.3 优点
- 封装性:客户端只需要知道产品的抽象类型,无需关心具体产品的实现细节。
- 可扩展性:当需要增加新的产品族时,只需要增加相应的具体产品类和具体工厂类,无需修改现有代码。
- 灵活性:可以在不修改客户端代码的情况下更换产品族。
3.4 缺点
- 增加系统的复杂性:由于涉及到多个抽象层,增加了系统的理解和维护难度。
3.5 代码示例
// 抽象产品A
public interface Engine {void run();void start();
}// 具体产品A1
public class LuxuryEngine implements Engine {@Overridepublic void run() {System.out.println("转的快");}@Overridepublic void start() {System.out.println("启动快!可以自动启停!");}
}// 抽象产品B
public interface Seat {void massage();
}// 具体产品B1
public class LuxurySeat implements Seat {@Overridepublic void massage() {System.out.println("可以自动按摩");}
}// 抽象工厂角色
public interface CarFactory {Engine createEngine();Seat createSeat();
}// 具体工厂A
public class LuxuryCarFactory implements CarFactory {@Overridepublic Engine createEngine() {return new LuxuryEngine();}@Overridepublic Seat createSeat() {return new LuxurySeat();}
}// 客户端代码
public class Client {public static void main(String[] args) {CarFactory factory = new LuxuryCarFactory();Engine engine = factory.createEngine();engine.run();engine.start();Seat seat = factory.createSeat();seat.massage();}
}
四、总结
方法工厂模式和抽象工厂模式都是用于创建对象的设计模式,但它们的应用场景和侧重点不同。方法工厂模式侧重于单个对象的创建,通过子类决定实例化哪个类;而抽象工厂模式则侧重于创建一系列相关或相互依赖的对象,通过接口来定义一组产品的创建方法。在实际开发中,应根据具体需求选择合适的设计模式。
相关文章:

Java工厂模式详解:方法工厂模式与抽象工厂模式
Java工厂模式详解:方法工厂模式与抽象工厂模式 一、引言 在Java开发中,设计模式是解决常见软件设计问题的一种有效方式。工厂模式作为创建型设计模式的一种,提供了灵活的对象创建机制,有助于降低代码的耦合度,提高系…...

springSecurity学习之springSecurity用户单设备登录
用户只能单设备登录 有时候在同一个系统中,只允许一个用户在一个设备登录。 之前的登陆者被顶掉 将最大会话数设置为1就可以保证用户只能同时在一个设备上登录 Override protected void configure(HttpSecurity http) throws Exception {http..anyRequest().aut…...

微信小程序实现聊天界面,发送功能
.wxml <scroll-view scroll-y"true" style"height: {{windowHeight}}px;"><view wx:for"{{chatList}}" wx:for-index"index" wx:for-item"item" style"padding-top:{{index0?30:0}}rpx"><!-- 左…...

【强化学习的数学原理】课程笔记--5(值函数近似,策略梯度方法)
目录 值函数近似一个例子TD 算法的值函数近似形式Sarsa, Q-learning 的值函数近似形式Deep Q-learningexperience replay 策略梯度方法(Policy Gradient)Policy Gradient 的目标函数目标函数 1目标函数 2两种目标函数的同一性 Policy Gradient 目标函数的…...

前端Long类型精度丢失:后端处理策略
文章目录 精度丢失的具体原因解决方法1. 使用 JsonSerialize 和 ToStringSerializer2. 使用 JsonFormat 注解3. 全局配置解决方案 结论 开发商城管理系统的品牌管理界面时,发现一个问题,接口返回品牌Id和页面展示的品牌Id不一致,如接口返回的…...

C++ | Leetcode C++题解之第300题最长递增子序列
题目: 题解: class Solution { public:int lengthOfLIS(vector<int>& nums) {int len 1, n (int)nums.size();if (n 0) {return 0;}vector<int> d(n 1, 0);d[len] nums[0];for (int i 1; i < n; i) {if (nums[i] > d[len])…...

springboo 整合 redis
springBoot 整合 redis starter启动依赖。—包含自动装配类—完成相应的装配功能。 引入依赖 <!--引入了redis整合springboot 的依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis&…...

dpdk编译安装以及接收udp报文(基于ubuntu)
目录 1、编译 2、设置运行环境 3、使用dpdk接收udp报文 3.1、设置发送端arp信息 3.2、测试 3.3、代码 4、其他 1、编译 代码下载: DPDK 下载版本:DPDK 19.08.2 export RTE_SDK/root/dpdk-stable-19.08.2/ export RTE_TARGETx86_64-native-li…...

【计算机网络】OSPF单区域实验
一:实验目的 1:掌握在路由器上配置OSPF单区域。 2:学习OSPF协议的原理,及其网络拓扑结构改变后的变化。 二:实验仪器设备及软件 硬件:RCMS交换机、网线、内网网卡接口、Windows 2019操作系统的计算机等。…...

Java聚合快递小程序对接云洋系统程序app源码
一场物流效率的革命 引言:物流新时代的序章 在数字化浪潮席卷各行各业的今天,物流行业也迎来了前所未有的变革。为了进一步提升物流效率,优化用户体验,聚合快递系统与云洋系统小程序的对接成为了行业内外关注的焦点。这一创新…...

【React】详解组件通信:从基础到进阶的全面指南
文章目录 一、父组件向子组件传递数据1. 基本概念2. 示例代码3. 详解定义子组件 Son定义父组件 App导出父组件 App数据流props 的内容 二、子组件向父组件传递数据1. 基本概念2. 示例代码3. 详解引入React库和useState钩子定义子组件 Son定义父组件 App导出父组件 App数据流 三…...

【vluhub】zabbix漏洞
介绍: zabbix是对服务器资源状态例如、内存空间、CPU、程序运行状态进行检测、设置预警值、短信设置等功能等一款开源工具。配置不当存在未授权,SQL注入漏洞 弱口令 nameadmin&passwordzabbix nameguest&password POST /index.php HTTP/1.1 Host: 192.1…...

openGauss触发器详解
openGauss 是一款开源关系型数据库管理系统,广泛应用于企业级应用中。随着数据量的增长和业务逻辑的复杂化,数据库管理和操作的自动化需求越来越高。触发器(Triggers)作为数据库中重要的编程工具,能够极大地简化复杂操…...

抄作业-跟着《React通关秘籍》捣鼓React-playground-上集
文章目录 前言1. 搭建react 开发环境2、react hooks 知识3. 目标:跟着小册实现 react-playground3.1 整体布局初始化项目使用Alloment 来实现左右分屏的拖拉功能 3.2 代码编辑器Monaco Editor 3.3 实现了多文件的切换用 useContext 来共享数据。优化 tab的样式&…...

80后最后的书信 年代
当时11亿人口只有1.8万部固定电话 中国几千年来 鱼传尺素 雁寄鸿书 写信最后要写 亲啓 如有照片,封面要写内有照片,请勿折叠 信的开头应该是 见字如面,展信舒颜 如果拜托别人做事情,最后要写为盼 最后要写 某某草 书未尽…...

软考-软件设计师(4)-计算机网络与安全:OSI七层、子网划分、网络安全控制技术、网络安全协议、网络安全威胁、对称与非对称加密等高频考点
场景 软考-软件设计师-计算机网络与信息安全模块高频考点整理。 以下为高频考点、知识点汇总,不代表该模块所有知识点覆盖,请以官方教程提纲为准。 注: 博客:霸道流氓气质-CSDN博客 实现 知识点 OSI/RM七层模型 注意各层的主要功能,特别是表示层负责数据的加密、压…...

Unity横板动作游戏 -为什么我又开始学习Unity,而不是Godot。
Readme 最近开始学习Unity制作2D动作游戏,由于一些操作第一次接触,为了加深印象,准备写这样一篇同步教程的笔记。 之前也接触过Unity,用 Unity 制作过一个非常简单的小游戏 Flappy Bird,并且魔改成了泰拉瑞亚的版本。…...

什么是NIO
NIO(New Input/Output),也称为Java非阻塞IO,是从Java 1.4版本开始引入的一个新的IO API,旨在提供一种比传统的阻塞IO更高效、更灵活的IO操作方式。 一 NIO用法的详细介绍 NIO支持面向缓冲区的、基于通道的IO操作&…...

PHP switch 替代品 match
match 是 PHP 8 中引入的新特性。在 PHP 8 中,match 用作新的类型安全的替代 switch 语句。它提供了更清晰、更简洁的语法,同时还支持表达式作为条件,可以更轻松地处理复杂的条件逻辑。 在 match 表达式中,每个分支都是一个条件和…...

FastAPI(七十四)实战开发《在线课程学习系统》接口开发-- 删除留言
源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 之前文章FastAPI(七十三)实战开发《在线课程学习系统》接口开发-- 回复留言,那么我们这次分享删除留言接口的开发…...

面试重点---快速排序
快排单趟 快速排序是我们面试中的重点,这个知识点也很抽象,需要我们很好的掌握,而且快速排序的代码也是非常重要,需要我们懂了还不行,必须要手撕代码,学的透彻。 在研究快速排序之前,我们首先…...

[MIT6.5840]MapReduce
MapReduce Lab 地址 https://pdos.csail.mit.edu/6.824/labs/lab-mr.html 论文地址 https://static.googleusercontent.com/media/research.google.com/zh-CN//archive/mapreduce-osdi04.pdf 工作原理 简单来讲,MapReduce是一种分布式框架,可以用来处理…...

【系统架构设计师】计算机组成与体系结构 ⑯ ( 奇偶校验码 | CRC 循环冗余码 | 海明码 | 模 2 除法 )
文章目录 一、校验码1、校验码由来2、奇偶校验码3、CRC 循环冗余码 ( 重点考点 )4、海明码校验 ( 软考不经常考到 ) 二、CRC 循环冗余码 ( 重点考点 )1、模 2 除法概念2、模 2 除法步骤3、模 2 除法示例4、CRC 循环冗余码示例 15、CRC 循环冗余码示例 2 参考之前的博客 : 【计…...

springboot,service 层统一异常抛出时,throws Exception写在接口上还是实现类上
springboot,service 层统一异常抛出时,throws Exception写在实现接口上,不是直接写在实现类上...

深度学习高效性网络
为了减轻Transformer笨重的计算成本,一系列工作重点开发了高效的Vision Transformer,如Swin Transformer、PVT、Twins、CoAtNet和MobileViT。 1、字节TRT-ViT 兼具CNN的速度、Transformer精度的模型 TRT-ViT(Transformer-based Vision Tra…...

PyQt ERROR:ModuleNotFoundError: No module named ‘matplotlib‘
Solution:打开cmd输入指令下载malplotlib pip install matplotlib...

Flutter Geolocator插件使用指南:获取和监听地理位置
Flutter Geolocator插件使用指南:获取和监听地理位置 简介 geolocator 是一个Flutter插件,提供了一个简单易用的API来访问特定平台的地理位置服务。它支持获取设备的最后已知位置、当前位置、连续位置更新、检查设备上是否启用了位置服务,以…...

网站基本布局CSS
代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title></title><style type"text/css">body {margi…...

ssm框架整合,异常处理器和拦截器(纯注解开发)
目录 ssm框架整合 第一步:指定打包方式和导入所需要的依赖 打包方法:war springMVC所需依赖 解析json依赖 mybatis依赖 数据库驱动依赖 druid数据源依赖 junit依赖 第二步:导入tomcat插件 第三步:编写配置类 SpringCon…...

古籍双层PDF制作教程:保姆级古籍数字化教程
在智慧古籍数字化项目中,很多图书馆要求将古籍导出为双层PDF,并且确保输出双层PDF底层文本与上层图片偏移量控制在1毫米以内。那么本教程带你使用古籍数字化平台,3分钟把一个古籍书籍转化为双侧PDF。 第1步:上传古籍 点批量上传…...