目录

一、简单工厂模式

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
繁体地址,请注明出处:http://hk.pswp.cn/news/906306.shtml
英文地址,请注明出处:http://en.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…