Java常用设计模式及其应用场景
1. 什么是设计模式?
设计模式是一个经过多次验证的、针对常见问题的可复用解决方案。设计模式并不是具体的代码实现,而是给出了如何解决问题的思路和结构。在实际开发过程中,设计模式有助于开发者快速找到合适的解决方案,从而减少重复造轮子的工作,提高开发效率。
设计模式通常用于以下方面:
- 解决软件设计中常见的结构性问题
- 提高代码的复用性和可维护性
- 增强代码的灵活性,使得后期维护和扩展更加简单
2. 设计模式的分类
设计模式根据其功能和应用场景的不同,通常分为三大类:
- 创建型模式:关注如何创建对象。
- 结构型模式:关注如何组合类和对象以实现更大规模的功能。
- 行为型模式:关注对象之间的交互和职责分配。
具体示例:
- 创建型模式:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
- 结构型模式:适配器模式、装饰器模式、代理模式。
- 行为型模式:观察者模式、策略模式。
3. 常用设计模式及其应用场景
1. 单例模式(Singleton Pattern)
单例模式确保一个类只有一个实例,并提供一个全局访问点。该模式通常用于管理全局状态,如日志记录、数据库连接池等。
应用场景:数据库连接池、日志类、配置类。
public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
2. 工厂方法模式(Factory Method Pattern)
工厂方法模式定义一个创建对象的接口,但由子类决定实例化哪个类。它将类的实例化推迟到子类。
应用场景:当你不希望具体化一个类,或者在实例化时需要很多条件判断时。
public interface Product {void doSomething();
}public class ConcreteProductA implements Product {@Overridepublic void doSomething() {System.out.println("Product A");}
}public abstract class Creator {public abstract Product factoryMethod();
}public class ConcreteCreatorA extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductA();}
}
3. 抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而无需指定具体的类。
应用场景:需要一组相关产品,但不希望产品的具体实现暴露给客户端时。
public interface AbstractFactory {Product createProduct();
}public class ConcreteFactoryA implements AbstractFactory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}
4. 建造者模式(Builder Pattern)
建造者模式将复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。
应用场景:当对象的构建过程独立于其组成部分的创建和装配时。
public class Product {private String partA;private String partB;public void setPartA(String partA) {this.partA = partA;}public void setPartB(String partB) {this.partB = partB;}
}public class ProductBuilder {private Product product;public ProductBuilder() {product = new Product();}public ProductBuilder buildPartA(String partA) {product.setPartA(partA);return this;}public ProductBuilder buildPartB(String partB) {product.setPartB(partB);return this;}public Product build() {return product;}
}
5. 原型模式(Prototype Pattern)
原型模式通过复制现有的实例来创建新对象,而不是通过构造函数创建。
应用场景:对象的创建成本较高,需要通过复制已有对象来创建时。
public class Prototype implements Cloneable {private String name;public Prototype(String name) {this.name = name;}@Overridepublic Prototype clone() throws CloneNotSupportedException {return (Prototype) super.clone();}
}
6. 适配器模式(Adapter Pattern)
适配器模式将一个类的接口转换成客户端希望的另一个接口,使得原本接口不兼容的类能够一起工作。
应用场景:当你希望在不修改代码的情况下,使接口不兼容的类可以一起工作时。
public interface Target {void request();
}public class Adaptee {public void specificRequest() {System.out.println("Specific request");}
}public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}
7. 装饰器模式(Decorator Pattern)
装饰器模式允许你动态地给一个对象添加额外的功能,而不需要改变其结构。
应用场景:当需要扩展类的功能,但又不想改变类的结构时。
public interface Component {void operation();
}public class ConcreteComponent implements Component {@Overridepublic void operation() {System.out.println("ConcreteComponent operation");}
}public class Decorator implements Component {private Component component;public Decorator(Component component) {this.component = component;}@Overridepublic void operation() {component.operation();System.out.println("Decorator additional operation");}
}
8. 代理模式(Proxy Pattern)
代理模式为其他对象提供代理以控制对该对象的访问。
应用场景:需要对对象的访问进行控制时,如延迟加载、权限控制等。
public interface Subject {void request();
}public class RealSubject implements Subject {@Overridepublic void request() {System.out.println("RealSubject request");}
}public class Proxy implements Subject {private RealSubject realSubject;@Overridepublic void request() {if (realSubject == null) {realSubject = new RealSubject();}realSubject.request();}
}
9. 观察者模式(Observer Pattern)
观察者模式定义了一种一对多的依赖关系,使得一个对象的状态变化时,其相关依赖对象都能收到通知并自动更新。
应用场景:当一个对象的状态变化需要通知其他多个对象时。
public interface Observer {void update(String message);
}public class ConcreteObserver implements Observer {@Overridepublic void update(String message) {System.out.println("Received message: " + message);}
}public class Subject {private List<Observer> observers = new ArrayList<>();public void addObserver(Observer observer) {observers.add(observer);}public void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}}
}
10. 策略模式(Strategy Pattern)
策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互换。策略模式让算法的变化独立于使用算法的客户。
应用场景:当有多个算法可以完成相同的任务时,可以通过策略模式选择不同的算法。
public interface Strategy {void execute();
}public class ConcreteStrategyA implements Strategy {@Overridepublic void execute() {System.out.println("Strategy A executed");}
}public class ConcreteStrategyB implements Strategy {@Overridepublic void execute() {System.out.println("Strategy B executed");}
}public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void executeStrategy() {strategy.execute();}
}
相关文章:
Java常用设计模式及其应用场景
1. 什么是设计模式? 设计模式是一个经过多次验证的、针对常见问题的可复用解决方案。设计模式并不是具体的代码实现,而是给出了如何解决问题的思路和结构。在实际开发过程中,设计模式有助于开发者快速找到合适的解决方案,从而减少…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_pnalloc函数
ngx_pnalloc 声明在 src\core\ngx_palloc.h void *ngx_pnalloc(ngx_pool_t *pool, size_t size); 定义在 src\core\ngx_palloc.c void * ngx_pnalloc(ngx_pool_t *pool, size_t size) { #if !(NGX_DEBUG_PALLOC)if (size < pool->max) {return ngx_palloc_small(pool, …...
【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析①】
ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase01 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-001测试用例 用例ID测试场景验证要点参考条款预期…...
A与B组件自动对齐与组装,无映射直接补偿。
网上针对组装的从视觉到控制动作,要不就是收费,要不就是简单介绍。这么详细的比较难找~ 手下留情,不喜勿喷! Show time~ 分步解决方案: 标定阶段(Calibration) 9点张氏标定(每个位置A1、A2、B1、B2): 使用机械手在相机视野内沿Z字形路径移动,覆盖9个点(XY方…...
QT 读写锁
一、概述 1、读写锁是一种线程同步机制,用于解决多线程环境下的读写竞争问题。 2、读写锁允许多个线程同时获取读锁(共享访问),但只允许一个线程获取写锁(独占访问)。 3、这种机制可以提高并发性能&…...
C++ 的时间库之二:Ratio
从现在开始,我们开始介绍 C 风格的时间处理,在这之前,首先要介绍std::ratio。因为 C 的 chrono库中的时间段(duration)定义离不开std::ratio,不了解std::ratio,就很难理解duration的定义。 1 st…...
使用小雅xiaoya/Emby正确的观看电影电视剧的姿势
最近有很多小伙伴来咨询关于小雅Emby全家桶的使用问题,最常见的就是在Emby上搜索出来资源之后,点击播放会提示【播放错误】,当前没有兼容的流。 这可把很多小伙伴给急坏了……于是找到小白咨询。 嗯……怎么说呢?小白并不喜欢看电…...
Java状态机
目录 1. 概念 2. 定义状态机 3. 生成一个状态机 4. 使用 1. 概念 在Java的应用开发里面,应该会有不少的人接触到一个业务场景下,一个数据的状态会发生多种变化,最经典的例子例如订单,当然还有像用户的状态变化(冻结…...
【Pandas】pandas Series isin
Pandas2.2 Series Computations descriptive stats 方法描述Series.align(other[, join, axis, level, …])用于将两个 Series 对齐,使其具有相同的索引Series.case_when(caselist)用于根据条件列表对 Series 中的元素进行条件判断并返回相应的值Series.drop([lab…...
通过VSCode直接连接使用 GPT的编程助手
GPT的编程助手在VSC上可以直接使用 选择相应的版本都可以正常使用。每个月可以使用40条,超过限制要付费。 如下图对应的4o和claude3.5等模型都可以使用。VSC直接连接即可。 配置步骤如下: 安装VSCODE 直接,官网下载就行 https://code.vis…...
一种最常见的js加密解密
前言 在前端开发的广袤天地中,你是否遭遇过一些看似“乱码”般的代码,根本无从下手理解?这其实很可能是被 _0x处理过的代码。_0x就像一位神秘的“化妆师”,能把原本清晰的代码改头换面。今天,我就来分享如何破解这些被…...
【Python爬虫(4)】揭开Python爬虫的神秘面纱:基础概念全解析
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
SMOJ 一笔画/洛谷 P7171 COCI 2020/2021 #3 Selotejp 题解
1.一笔画 题意 给出 n 行 m 列的点阵,每个点是一个字符: “.” 或 “#” ,其中“#”表示该点是障碍物。 现在小毛的问题是: 他最少要画多少笔才能把点阵里所有的“.”都覆盖完毕(被小毛画到的点就会被覆盖ÿ…...
【Java学习】继承
一、继承 子类继承父类,子类这个类变量的引用在原有的指向子类自己类变量空间的原有访问权限上,增加上了父类类变量空间的访问权限,此时子类类变量指向的空间变为了原来子类类变量空间加上父类类变量空间,此时子类类变量空间就变成…...
计时器任务实现(保存视频和图像)
下面是一个简单的计时器任务实现,可持续地每秒保存一幅图像,也可持续地每60秒保存一个视频,图像和视频均以当前时间命名: TimerTask类的实现如下: class TimerTask { public:TimerTask(const std::string& path):…...
树莓百度百科能否揭开成都树莓集团的神秘面纱?
树莓百度百科作为大众获取信息的重要渠道,在一定程度上为人们了解树莓集团提供了窗口,但要完全揭开其神秘面纱,仍存在一定局限性。 从树莓百度百科上,我们能获取到关于树莓集团的基本信息,如公司的成立时间、法定代表人…...
【如何看懂数据手册和原理图】
【如何看懂数据手册和原理图】 文章目录 【如何看懂数据手册和原理图】1.数据手册1.1去哪里看?1.2需要注意的 2.支路3.回路4.网孔5.电路定理:基尔霍夫定律**集总参数电路** 抽象理想化5.1基尔霍夫电流定律 (KCL)5.2基尔霍夫电压定律 (KVL)5.3总结 6.读懂…...
SQL 优化工具使用之 explain 详解
一、导读 对于大部分开发人员来说,平常接触的无非就是增删改查这些基本操作,创建存储过程,视图等等都是 DBA 该干的活,但是想要把这些基本操作写的近乎完美也是一件难事。 而 explain 显示了 MySQL 如何使用索引来处理 select 语…...
深度解析Unity3D渲染管线:网格、材质与GPU渲染的协同逻辑
在3D实时渲染领域,网格(Mesh)、材质(Material)和GPU渲染三者构成了虚拟世界的基石。它们如同乐高积木的零件,通过精确的协作,最终在屏幕上呈现出复杂的视觉场景。本文将从技术原理、协作机制到性…...
POI优化Excel录入
57000单词原始录入时间258S 核心代码: List<Word> wordBookList ExcelUtil.getReader(file.getInputStream()).readAll(Word.class);if (!CollectionUtil.isEmpty(wordBookList)) {for (Word word : wordBookList) {//逐条向数据库中插入单词wordMapper.insert(word);}…...
开源工具openclaw-memory-quality:量化评估AI模型记忆质量
1. 项目概述:一个开源记忆质量评估工具最近在整理个人知识库和项目文档时,我遇到了一个几乎所有深度学习和自然语言处理从业者都会头疼的问题:如何量化评估一个AI模型“记住”和“回忆”信息的能力?或者说,我们怎么知道…...
表格数据特征工程中的词嵌入技术应用与优化
1. 表格数据特征工程中的词嵌入技术解析在传统机器学习项目中,我们常常会遇到包含文本字段的结构化表格数据。比如电商领域的商品描述、金融领域的客户备注信息,或是医疗领域的病历摘要。这些文本字段如果直接用One-Hot或TF-IDF处理,往往会面…...
观察 Taotoken 在不同时段与模型下的服务稳定性与可用性
观察 Taotoken 在不同时段与模型下的服务稳定性与可用性 1. 长期使用体验概述 作为长期使用 Taotoken 的开发者,我们在过去六个月中持续通过 API 调用各类主流模型,覆盖了工作日白天、晚间以及周末等不同时段。整体而言,平台提供的统一接入…...
SoC测试太头疼?试试SSN:一个让DFT工程师告别布线噩梦和测试时间浪费的“解耦”神器
SoC测试效率革命:SSN如何重构DFT工程师的工作流 在28nm以下工艺节点,单个SoC集成超过200亿晶体管已成为常态。某头部芯片厂商的DFT团队曾向我展示过一组数据:他们的5nm移动SoC中,仅扫描链布线就占用了12%的全局布线资源ÿ…...
在多轮对话应用中观察通过聚合路由后的API稳定性表现
在多轮对话应用中观察通过聚合路由后的API稳定性表现 1. 多轮对话场景的技术挑战 开发需要连续调用大模型进行多轮对话的应用时,稳定性是核心考量因素之一。这类应用通常需要维持较长的会话周期,期间可能涉及数十次甚至上百次的API调用。在实际工程实践…...
前端性能优化:关键渲染路径优化
前端性能优化:关键渲染路径优化 为什么关键渲染路径这么重要? 关键渲染路径,一个被很多前端开发者忽视的概念,却直接决定了页面的加载速度和用户体验。如果你想让你的页面在用户打开的瞬间就展现内容,而不是让用户盯着…...
Swoole协程+LLM流式响应实战:3步构建百万级稳定长连接通道(附压测对比数据)
更多请点击: https://intelliparadigm.com 第一章:Swoole协程LLM流式响应的核心价值与架构定位 在高并发 AI 服务场景中,传统同步阻塞模型难以应对 LLM 推理的长耗时与多轮交互特性。Swoole 协程通过用户态轻量级调度,将 I/O 等待…...
网络安全实践中CIIM框架的后现象学分析
大家读完觉得有帮助记得关注和点赞!!!摘要本文将后现象学理论应用于网络安全风险管理领域,论证了形式风险模型作为中介人工物(mediating artifacts)的功能,它们塑造了安全从业者或分析师感知、解…...
为什么Seerr是解决家庭媒体服务器内容发现与请求管理的最佳方案
为什么Seerr是解决家庭媒体服务器内容发现与请求管理的最佳方案 【免费下载链接】seerr Open-source media request and discovery manager for Jellyfin, Plex, and Emby. 项目地址: https://gitcode.com/GitHub_Trending/je/seerr 在当今流媒体内容爆炸的时代…...
游戏PBR材质自动生成:从低分辨率截图到次世代渲染
1. 项目背景与核心价值 去年在为一个游戏项目做美术资源优化时,我们遇到了一个典型问题:如何将大量低分辨率的模拟器截图转化为可用于次世代引擎的PBR材质。传统方法要么丢失细节,要么需要美术人员手动重绘,成本高得离谱。这个项目…...
