Java设计模式

Java设计模式详解

设计模式是软件开发过程中针对常见问题的经过验证的、可复用的解决方案。Java作为一种面向对象的编程语言,广泛应用各种设计模式。以下详细介绍Java中常见的23种设计模式,分为创建型、结构型和行为型三大类。

创建型模式

创建型模式关注对象的创建过程,试图将对象的创建与使用分离。

1. 单例模式 (Singleton Pattern)

定义:确保一个类只有一个实例,并提供一个全局访问点。

实现方式

  1. 饿汉式:类加载时就创建实例
public class EagerSingleton {private static final EagerSingleton instance = new EagerSingleton();private EagerSingleton() {}public static EagerSingleton getInstance() {return instance;}
}
  1. 懒汉式:延迟创建实例(线程不安全)
public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}
  1. 双重检查锁定:线程安全且高效
public class DCLSingleton {private volatile static DCLSingleton instance;private DCLSingleton() {}public static DCLSingleton getInstance() {if (instance == null) {synchronized (DCLSingleton.class) {if (instance == null) {instance = new DCLSingleton();}}}return instance;}
}
  1. 静态内部类:线程安全且延迟加载
public class StaticInnerSingleton {private StaticInnerSingleton() {}private static class SingletonHolder {private static final StaticInnerSingleton INSTANCE = new StaticInnerSingleton();}public static StaticInnerSingleton getInstance() {return SingletonHolder.INSTANCE;}
}
  1. 枚举:最简洁的实现,自动处理序列化
public enum EnumSingleton {INSTANCE;public void doSomething() {// 业务方法}
}

应用场景

  • 配置管理器
  • 线程池、连接池
  • 缓存
  • 日志记录器

Java中的应用

  • java.lang.Runtime
  • java.awt.Desktop

2. 工厂方法模式 (Factory Method Pattern)

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。

结构

  • 抽象产品
  • 具体产品
  • 抽象工厂
  • 具体工厂

示例

// 抽象产品
interface Product {void operation();
}// 具体产品
class ConcreteProductA implements Product {@Overridepublic void operation() {System.out.println("ConcreteProductA operation");}
}class ConcreteProductB implements Product {@Overridepublic void operation() {System.out.println("ConcreteProductB operation");}
}// 抽象工厂
abstract class Creator {public abstract Product createProduct();public void someOperation() {Product product = createProduct();product.operation();}
}// 具体工厂
class ConcreteCreatorA extends Creator {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}class ConcreteCreatorB extends Creator {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}

应用场景

  • 当一个类不知道它所需要的对象的类时
  • 当一个类希望由子类来指定它所创建的对象时
  • 当类将创建对象的职责委托给多个帮助子类中的某一个时

Java中的应用

  • java.util.Calendar.getInstance()
  • java.util.ResourceBundle.getBundle()
  • java.text.NumberFormat.getInstance()

3. 抽象工厂模式 (Abstract Factory Pattern)

定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

结构

  • 抽象产品族
  • 具体产品
  • 抽象工厂
  • 具体工厂

示例

// 抽象产品A
interface ProductA {void operationA();
}// 具体产品A1
class ConcreteProductA1 implements ProductA {@Overridepublic void operationA() {System.out.println("ProductA1 operationA");}
}// 具体产品A2
class ConcreteProductA2 implements ProductA {@Overridepublic void operationA() {System.out.println("ProductA2 operationA");}
}// 抽象产品B
interface ProductB {void operationB();
}// 具体产品B1
class ConcreteProductB1 implements ProductB {@Overridepublic void operationB() {System.out.println("ProductB1 operationB");}
}// 具体产品B2
class ConcreteProductB2 implements ProductB {@Overridepublic void operationB() {System.out.println("ProductB2 operationB");}
}// 抽象工厂
interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA1();}@Overridepublic ProductB createProductB() {return new ConcreteProductB1();}
}// 具体工厂2
class ConcreteFactory2 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA2();}@Overridepublic ProductB createProductB() {return new ConcreteProductB2();}
}

应用场景

  • 系统需要独立于产品的创建、组合和表示
  • 系统需要由多个产品系列中的一个来配置
  • 强调一系列相关产品对象的设计以便进行联合使用

Java中的应用

  • javax.xml.parsers.DocumentBuilderFactory
  • javax.xml.transform.TransformerFactory
  • Spring中的BeanFactory

4. 建造者模式 (Builder Pattern)

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

结构

  • 产品
  • 抽象建造者
  • 具体建造者
  • 指挥者

示例

// 产品
class Product {private String partA;private String partB;private String partC;public void setPartA(String partA) {this.partA = partA;}public void setPartB(String partB) {this.partB = partB;}public void setPartC(String partC) {this.partC = partC;}@Overridepublic String toString() {return "Product{partA='" + partA + "', partB='" + partB + "', partC='" + partC + "'}";}
}// 抽象建造者
interface Builder {void buildPartA();void buildPartB();void buildPartC();Product getResult();
}// 具体建造者
class ConcreteBuilder implements Builder {private Product product = new Product();@Overridepublic void buildPartA() {product.setPartA("PartA");}@Overridepublic void buildPartB() {product.setPartB("PartB");}@Overridepublic void buildPartC() {product.setPartC("PartC");}@Overridepublic Product getResult() {return product;}
}// 指挥者
class Director {public Product construct(Builder builder) {builder.buildPartA();builder.buildPartB();builder.buildPartC();return builder.getResult();}
}

应用场景

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
  • 当构造过程必须允许被构造的对象有不同的表示时

Java中的应用

  • java.lang.StringBuilder
  • java.lang.StringBuffer
  • Lombok的@Builder注解
  • Spring的BeanDefinitionBuilder

现代Java中的实现: 流式接口(链式调用)

public class Person {private final String name;private final int age;private final String address;private Person(Builder builder) {this.name = builder.name;this.age = builder.age;this.address = builder.address;}public static class Builder {private String name;

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

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

相关文章

机器学习——KNN超参数

sklearn.model_selection.GridSearchCV 是 scikit-learn 中用于超参数调优的核心工具,通过结合交叉验证和网格搜索实现模型参数的自动化优化。以下是详细介绍: 一、功能概述 GridSearchCV 在指定参数网格上穷举所有可能的超参数组合,通过交叉…

STM32基础教程——定时器

前言 TIM定时器(Timer):STM32的TIM定时器是一种功能强大的外设模块,通过时基单元(包含预分频器、计数器和自动重载寄存器)实现精准定时和计数功能。其核心原理是:内部时钟(CK_INT)或…

[特殊字符] 树莓派声卡驱动原理全解析:从模拟耳机口到HiFi DAC

一、为什么要关注树莓派的声卡驱动? 树莓派(Raspberry Pi)作为一款广泛应用的单板计算机,集成了多种音频输出接口(如 3.5mm 耳机、HDMI、I2S 外接 DAC 等)。但许多用户在使用中会遇到诸如“耳机输出杂音”…

使用若依AI生成springBoot的前后端分离版本

目录 1. 从Git上面下载前后端分离版本 2. 执行SQL脚本 3. 初始化前端 安装Node.js和npm配置 ✅ 第一步:在 Node 安装目录下创建两个文件夹 ✅ 第二步:配置 npm 全局目录和缓存目录 ✅ 第三步:验证配置是否成功 ✅ 第四步:…

神聖的綫性代數速成例題12. 齊次方程組零解充要條件、其齊次方程組非零解、 齊次方程組基礎解系

1. 綫性空間的定義: 設是一個非空集合,是一個數域。 在集合的元素之間定義了加法運算,即對於任意,有唯一的,使得;在數域與集合的元素之間定義了數乘運算,即對於任意和,有唯一的&am…

万亿级数据量的OceanBase应用从JVM到协议栈立体化改造实现性能调优

本文基于某电商平台亿级商品详情页场景,通过Java应用层与数据库层的协同优化,实现98%的查询响应时间低于50ms。 一、JDBC连接池深度调优 HikariCP配置示例: HikariConfig config new HikariConfig(); config.setJdbcUrl("jdbc:ocean…

腾讯:《详解DeepSeek:模型训练、优化及数据处理的技术精髓》23页|附下载方法

导 读 INTRODUCTION 这是一篇来自腾讯的关于DeepSeek大语言模型及其技术特点、应用场景和未来发展趋势的文章,主要介绍了DeepSeek的核心技术优势、行业应用案例以及在AI领域的竞争力和发展趋势。为理解DeepSeek大语言模型的技术优势和应用前景提供了深入的分析&…

Vue 入门到实战 五

第5章 过渡与动画 目录 5.1 单元素/组件过渡 5.1.1 过渡class 5.1.2 CSS 过渡 5.1.3 CSS 动画 5.1.4 同时使用过渡和动画 5.1.5 JavaScript 钩子方法 5.2 多元素/组件过渡 5.2.1 多元素过渡 5.2.2 多组件过渡 5.3 列表过渡 5.3.1 列表的普通过渡 5.3.2 列表的平滑…

L2TP实验

一、拓朴图 二、实验配置 1.基础配置 1.1接口IP及服务配置 [PPPoE Client]interface GigabitEthernet 0/0/0 [PPPoE Client-GigabitEthernet0/0/0]service-manage all permit [NAS]interface GigabitEthernet 0/0/0 [NAS-GigabitEthernet0/0/0]ip add 192.168.0.2 24 [NAS-Gi…

简单实用!百度AI + Raphael AI = 免费生图

简单实用!百度AI Raphael AI 免费生图 -- ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b55eda9141d34697b05db0cd60f62b75.png#pic_center) 第一步:下载或截取一些好看的图片当参考图片 第二步:用百度AI描述你想要的图片&…

aws(学习笔记第三十四课) dockerized-app with asg-alb

文章目录 aws(学习笔记第三十四课) dockerized-app with asg-alb学习内容:1. 整体架构1.1 代码链接1.2 代码手动修改部分1.2.1 rds_stack.py1.2.2 efs_stack.py1.2.3 asg_stack.py1.2.4 userdata.sh 1.2 整体架构 2.代码解析2.1 全体app.py2.2 NetworkStatck网络2.3…

面试总结之 Glide自定义的三级缓存策略

一、为什么需要三级缓存? 在移动应用开发中,图片加载性能直接影响用户体验。根据 Google 统计,图片加载延迟超过 1 秒会导致 32% 的用户流失。传统图片加载方案存在以下痛点: 内存占用高:未压缩的大图直接占用大量内…

用Python实现交互式数据可视化:从基础图表到动态仪表板

用Python实现交互式数据可视化:从基础图表到动态仪表板 一、项目背景 本文将通过一个完整的Python项目,展示如何使用Plotly和ipywidgets构建从基础统计到动态交互的全栈数据可视化方案。 二、核心功能模块 1. 数据生成与预处理 np.random.seed(100)…

Linux进程信号

1.信号的认识 生活中例如闹钟,红绿灯,电话铃声等都属于信号,所白了信号就是中断我们正在做的事情,属于进行事件异步通知机制。 在Linux中信号是发给进程的,信号的产生相较于进程是异步的。 信号的相关知识点&#xff…

Java使用FFmpegFrameGrabber进行视频拆帧,结合Thumbnails压缩图片保存到文件夹

引入依赖 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.17</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ja…

c++项目-KV存储-模仿redis实现kv键值对存储的基本功能。

KV存储引擎的技术解析&#xff1a;数组、哈希与红黑树实现及其在网络I/O中的应用。 内容概要&#xff1a;本文档深入介绍了基于数组、哈希表和红黑树的键值存储引擎的设计与实现。文档首先阐述了系统的总体架构与类图关系&#xff0c;之后分别对底层存储结构进行了详细解释&am…

vue3:十一、主页面布局(优化页面跳转方式)

:router"true" 一、参考文章 vue3:十一、主页面布局(实现基本左侧菜单右侧内容效果)-CSDN博客 参考上述文章可知&#xff0c;页面跳转是通过在js中定义的菜单中携带的path&#xff0c;然后通过菜单的点击事件完成的跳转&#xff0c;现在可以进行优化&#xff0c;直…

深入解析 Java Stream API:筛选子节点的优雅实现!!!

&#x1f680; 深入解析 Java Stream API&#xff1a;筛选子节点的优雅实现 &#x1f527; 大家好&#xff01;&#x1f44b; 今天我们来聊聊 Java 8 中一个非常常见的操作&#xff1a;使用 Stream API 从 Map 中筛选出特定条件的元素。&#x1f389; 具体来说&#xff0c;我们…

统计学重要概念:自由度

在统计学中&#xff0c;自由度&#xff08;degrees of freedom&#xff0c;简称df&#xff09;是一个重要的概念&#xff0c;它表示在计算某个统计量时可以自由变化的值的数量。对于一个样本量为n的样本&#xff0c;自由度通常为n-1&#xff0c;这是因为我们需要用样本数据来估…

数据结构-排序

文章目录 1. 排序的概念2. 常见排序算法的实现2.1 插入排序1&#xff09;插入排序一&#xff09;基本思想二&#xff09;特性及时间复杂度三&#xff09;代码实现 2&#xff09;希尔排序&#xff08;缩小增量排序&#xff09;一&#xff09;基本思想二&#xff09;特性及时间复…