【设计模式】基于 Java 语言实现工厂模式

目录

一、简单工厂模式

1.1 简单工厂模式的介绍

二、工厂方法模式

2.1 工厂方法模式的介绍

2.2 工厂方法模式的基本实现

2.3 工厂方法模式的应用场景

三、抽象工厂

3.1 抽象工厂的概念

3.2 抽象工厂的基本结构

3.3 抽象工厂的基本实现

3.4 抽象工厂的应用场景

四、工厂模式的总结

4.1 工厂模式优点和缺点

4.2 工厂模式的适用场景

4.2.1 线程工厂(ThreadFactory)

4.2.2 Bean 工厂(FactoryBean)


工厂模式是一种创建型设计模式,它提供了一种封装对象实例化过程的方法,使客户端无需了解具体的实现细节即可获得所需的对象。通过定义一个用于创建对象的接口(工厂),让子类决定具体实例化哪一个产品类,从而使得代码在应对变化时更加灵活且易于扩展。

通俗地讲,工厂模式的本质就是用工厂方法,代替 new 操作创建一种实例化对象的方式。

一、简单工厂模式

1.1 简单工厂模式的介绍

简单⼯⼚模式是⼀种创建型设计模式,但并不属于23种设计模式之⼀,更多的是⼀种编程习惯。

简单⼯⼚模式的核⼼思想:将产品的创建过程封装在⼀个⼯⼚类中,把创建对象的流程集中在这个⼯⼚类⾥⾯。

简单⼯⼚模式的角色:

  1. 抽象产品:描述产品的通⽤⾏为,通常由一个 Java 接口或一个 Java 抽象类定义。

  2. 具体产品: 实现抽象产品接⼝或继承抽象产品类。

  3. ⼯⼚类:负责创建产品,根据传递的不同参数创建不同的产品示例。

简单⼯⼚类简化了客户端操作,客户端可以调⽤⼯⼚⽅法来获取具体产品,⽽⽆需直接与具体产品类交互,降低了耦合,但是有⼀个很⼤的问题就是不够灵活,如果需要添加新的产品,就需要修改⼯⼚类的代码。

简单工厂的缺点:单⼯⼚模式只有⼀个⼯⼚类,负责创建所有产品,如果要添加新的产品,通常需要修改⼯⼚类的代码。

二、工厂方法模式

2.1 工厂方法模式的介绍

⼯⼚⽅法模式也是⼀种创建型设计模式:⼯⼚⽅法模式引⼊了抽象⼯⼚和具体⼯⼚的概念,每个具体⼯⼚只负责创建⼀个具体产品,添加新的产品只需要添加新的⼯⼚类⽽⽆需修改原来的代码,这样就使得产品的⽣产更加灵活,⽀持扩展,符合开闭原则。

⼯⼚⽅法模式分为以下⼏个⻆⾊:

  • 抽象⼯⼚:⼀个接⼝,包含⼀个抽象的⼯⼚⽅法(⽤于创建产品对象)。

  • 具体⼯⼚:实现抽象⼯⼚接⼝,创建具体的产品。

  • 抽象产品:定义产品的接⼝。

  • 具体产品:实现抽象产品接⼝,是⼯⼚创建的对象。

2.2 工厂方法模式的基本实现

// 抽象产品
interface Shape {void draw();
}// 具体产品 - 圆形
class Circle implements Shape {@Overridepublic void draw() {System.out.println("Circle");}
}// 具体产品 - 正⽅形
class Square implements Shape {@Overridepublic void draw() {System.out.println("Square");}
}// 抽象⼯⼚
interface ShapeFactory {Shape createShape();
}// 具体⼯⼚ - 创建圆形
class CircleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}
// 具体⼯⼚ - 创建正⽅形
class SquareFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Square();}
}
/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/906306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV CUDA模块中的矩阵算术运算------创建卷积操作对象的工厂方法 cv::cuda::createConvolution

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 createConvolution函数是OpenCV CUDA 模块中用于创建卷积操作对象的工厂方法。它返回一个指向 cv::cuda::Convolution 接口的智能指针&#xff0…

IDEA:程序编译报错:java: Compilation failed: internal java compiler error

目录 简介异常信息排查原因解决 简介 代码无法编译、无法打包 异常信息 java: Compilation failed: internal java compiler error排查 1、代码近期没有改动过,原先是可以正常编译的 2、查看程序JDK,是JDK1.8没错,与原先JDK一致 3、出现…

windows 10 做服务器 其他电脑无法访问,怎么回事?

一般我们会先打开win10自己的防火墙策略,但是容易忽略 电脑之间 路由器上的防火墙,此时也需要查看一下,可以尝试先关闭路由器防火墙,如果可以了,再 设置路由器上的防火墙规则。 将路由器的上网设置 改成 路由模式 &a…

【人工智能-agent】--Dify+Mysql+Echarts搭建了一个能“听懂”人话的数据可视化助手!

Echarts官网:https://echarts.apache.org/zh/index.html ECharts 是一个由百度团队开发的、基于 JavaScript 的开源可视化图表库,它提供了丰富的图表类型和强大的交互功能,能够帮助开发者轻松创建专业级的数据可视化应用。 核心特点 丰富的图…

Android设备 显示充电速度流程

整体逻辑:设备充电速度的判断 系统通过读取充电器的最大电流(Current)与最大电压(Voltage),计算最大充电功率(Wattage),以此判断当前是慢充、普通充还是快充&#xff1a…

十一、Hive JOIN 连接查询

作者:IvanCodes 日期:2025年5月16日 专栏:Hive教程 在数据分析的江湖中,数据往往分散在不同的“门派”(表)之中。要洞察数据间的深层联系,就需要JOIN这把利器,将相关联的数据串联起来…

Excel在每行下面插入数量不等的空行

1、在B列输入要添加的空行数量(如果加7行,则写6,也可以插入数量不等的空行) 2、在C1单元格输入1 3、在C2输入公式:SUM($B$1:B1)1,下拉填充 4、在C9单元格输入1 5、选中C9单元格-->选择菜单栏“开始”…

iOS热更新技术要点与风险分析

iOS的热更新技术允许开发者在无需重新提交App Store审核的情况下,动态修复Bug或更新功能,但需注意苹果的审核政策限制。以下是iOS热更新的主要技术方案及要点: 一、主流热更新技术方案 JavaScript动态化框架 React Native & Weex 通过Jav…

服务器多用户共享Conda环境操作指南——Ubuntu24.02

1. 使用阿里云镜像下载 Anaconda 最新版本 wget https://mirrors.aliyun.com/anaconda/archive/Anaconda3-2024.02-1-Linux-x86_64.sh bug解决方案 若出现:使用wget在清华镜像站下载Anaconda报错ERROR 403: Forbidden. 解决方案:wget --user-agent“M…

基于YOLO算法的目标检测系统实现指南

YOLO(You Only Look Once)作为计算机视觉领域最具影响力的实时目标检测算法之一,其最新版本YOLOv8在速度与精度之间达到了新的平衡。本文将从技术实现角度,详细介绍如何使用YOLO算法构建高效的目标检测系统。 一、算法原理与技术架构 1.1 YOLO核心思想…

C++ asio网络编程(6)利用C11模拟伪闭包实现连接的安全回收

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、智能指针管理Session二、用智能指针来实现Server的函数1.start_accept()1.引用计数注意点2.std::bind 与异步回调函数的执行顺序分析 2.handle_accept1.异步…

AI与产品架构设计(2):Agent系统的应用架构与落地实

什么是AI Agent?其在架构中的独特定位 AI Agent(人工智能代理)是一种模拟人类智能行为的自主系统,通常以大型语言模型(LLM)作为核心引擎。简单来说,Agent能够像人一样感知环境信息、规划行动方…

Rust 数据结构:String

Rust 数据结构:String Rust 数据结构:String什么是字符串?创建新字符串更新字符串将 push_str 和 push 附加到 String 对象后使用 运算符和 format! 宏 索引到字符串字符串在内存中的表示字节、标量值和字形簇 分割字符串遍历字符串的方法 R…

Java卡与SSE技术融合实现企业级安全实时通讯

简介 在数字化转型浪潮中,安全与实时数据传输已成为金融、物联网等高安全性领域的核心需求。本文将深入剖析东信和平的Java卡权限分级控制技术与浪潮云基于SSE的大模型数据推送技术,探索如何将这两项创新技术进行融合,构建企业级安全实时通讯系统。通过从零到一的开发步骤,…

继MCP、A2A之上的“AG-UI”协议横空出世,人机交互迈入新纪元

第一章:AI交互的进化与挑战 1.1 从命令行到智能交互 人工智能的发展历程中,人机交互的方式经历了多次变革。早期的AI系统依赖命令行输入,用户需通过特定指令与机器沟通。随着自然语言处理技术的进步,语音助手和聊天机器人逐渐普…

MySQL刷题相关简单语法集合

去重 distinct 关键字 eg. :select distinct university from user_profile 返回行数限制: limit关键字 eg. :select device_id from user_profile limit 2 返回列重命名:as 关键字 eg.:select device_id as user_in…

Kubernetes MCP服务器(K8s MCP):如何使用?

#作者:曹付江 文章目录 1、什么是 Kubernetes MCP 服务器?1.1、K8s MCP 服务器 2、开始前的准备工作2.1. Kubernetes集群2.2. 安装并运行 kubectl2.3. Node.js 和 Bun2.4. (可选)Helm v3 3、如何设置 K8s MCP 服务器3.1. 克隆存储…

计算机网络-HTTP与HTTPS

文章目录 计算机网络网络模型网络OSITCP/IP 应用层常用协议HTTP报文HTTP状态码HTTP请求类型HTTP握手过程HTTP连接HTTP断点续传HTTPSHTTPS握手过程 计算机网络 网络模型 为了解决多种设备能够通过网络相互通信,解决网络互联兼容性问题。 网络模型是计算机网络中用于…

Springboot 跨域拦截器配置说明

错误代码 跨域设置 Configuration public class WebConfig implements WebMvcConfigurer {/*** cors 跨域配置*/Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedMethods("GET", "HEAD", &qu…

受不了github的网络限制了,我开源了一个图床工具 gitee-spring-boot-starter

嗨嗨嗨~ 我老马又又来了!!!上次写了一篇我开源了一款阿里云OSS的spring-boot-starter,然后买的资源包到期了,后面又想白(开)嫖(源)的路子,首先想到了使用gith…