【JAVA】Java高级:Java中的常用设计模式——设计模式的基本思想与应用场景

在软件开发中,设计模式是一种被反复使用的解决特定问题的最佳实践。它们提供了一种标准化的方式来解决常见的设计问题,使得代码更具可读性、可维护性和可扩展性。特别是在Java开发中,设计模式的使用可以极大地提高代码的质量和开发效率。

设计模式不仅仅是代码的实现,它们还反映了软件设计的思维方式。通过理解和应用设计模式,开发者能够更好地应对复杂系统中的变化,提升团队的协作能力。

设计模式的分类

设计模式通常分为三大类:

  1. 创建型模式:关注对象的创建过程。

  2. 结构型模式:关注类和对象的组合。

  3. 行为型模式:关注对象之间的交互。

接下来,我们将逐一介绍这些模式及其应用场景,并通过具体的Java示例来阐明它们的使用。

一、创建型模式

创建型模式主要涉及如何创建对象。常见的创建型模式有:

  • 单例模式(Singleton)

  • 工厂模式(Factory)

  • 抽象工厂模式(Abstract Factory)

  • 建造者模式(Builder)

  • 原型模式(Prototype)

1. 单例模式(Singleton)

基本思想:确保一个类只有一个实例,并提供一个全局访问点。

应用场景:需要控制对某个资源的访问,例如数据库连接、线程池等。

示例代码

public class Singleton {// 私有静态实例private static Singleton instance;// 私有构造函数private Singleton() {}// 公共静态方法,提供全局访问点public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

代码解释

  • private static Singleton instance;:存储唯一实例。

  • private Singleton():私有构造函数,防止外部实例化。

  • public static Singleton getInstance():提供全局访问点,懒加载实例。

2. 工厂模式(Factory)

基本思想:定义一个接口用于创建对象,但让子类决定实例化哪一个类。

应用场景:当系统需要独立于产品的创建、组合和表示时。

示例代码

// 产品接口
interface Product {void use();
}// 具体产品
class ConcreteProductA implements Product {public void use() {System.out.println("Using Product A");}
}class ConcreteProductB implements Product {public void use() {System.out.println("Using Product B");}
}// 工厂类
class ProductFactory {public static Product createProduct(String type) {if (type.equals("A")) {return new ConcreteProductA();} else if (type.equals("B")) {return new ConcreteProductB();}return null;}
}

代码解释

  • Product接口定义了产品的行为。

  • ConcreteProductAConcreteProductB是具体的产品实现。

  • ProductFactory类根据传入的类型创建相应的产品。

二、结构型模式

结构型模式关注类和对象的组合,常见的结构型模式有:

  • 适配器模式(Adapter)

  • 装饰者模式(Decorator)

  • 代理模式(Proxy)

  • 外观模式(Facade)

  • 组合模式(Composite)

1. 适配器模式(Adapter)

基本思想:将一个类的接口转换成客户端所期望的另一个接口,使得原本由于接口不兼容而无法一起工作的类可以一起工作。

应用场景:当你想使用一些现有的类,但它们的接口不符合你的需求时。

示例代码

// 目标接口
interface Target {void request();
}// 适配者类
class Adaptee {public void specificRequest() {System.out.println("Specific request");}
}// 适配器类
class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}public void request() {adaptee.specificRequest();}
}

代码解释

  • Target是客户端所期望的接口。

  • Adaptee是现有的类,接口不兼容。

  • Adapter实现了Target接口,并通过组合Adaptee来适配其方法。

三、行为型模式

行为型模式关注对象之间的交互,常见的行为型模式有:

  • 策略模式(Strategy)

  • 观察者模式(Observer)

  • 命令模式(Command)

  • 状态模式(State)

  • 迭代器模式(Iterator)

1. 策略模式(Strategy)

基本思想:定义一系列算法,将每一个算法封装起来,并使它们可以互换。

应用场景:需要在运行时选择算法时,例如排序策略。

示例代码

// 策略接口
interface Strategy {int doOperation(int num1, int num2);
}// 具体策略
class OperationAdd implements Strategy {public int doOperation(int num1, int num2) {return num1 + num2;}
}class OperationSubtract implements Strategy {public int doOperation(int num1, int num2) {return num1 - num2;}
}// 上下文
class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public int executeStrategy(int num1, int num2) {return strategy.doOperation(num1, num2);}
}

代码解释

  • Strategy接口定义了算法的行为。

  • OperationAddOperationSubtract是具体的算法实现。

  • Context类持有一个Strategy对象,并在运行时决定使用哪个策略。

总结

在日常生活中,我们可以将设计模式比作不同的工具。例如,做饭时,我们可以选择不同的烹饪方式(蒸、煮、炒),每种方式都有其特定的应用场景和效果。设计模式就像这些烹饪方式,帮助我们根据需求选择最合适的解决方案。通过不断学习和实践设计模式,开发者能够在复杂的项目中游刃有余。

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

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

相关文章

【mac】终端左边太长处理,自定义显示名称(terminal路径显示特别长)

1、打开终端 2、步骤 (1)修改~/.zshrc文件 nano ~/.zshrc(2)添加或修改PS1,我是自定义了名字为“macminiPro” export PS1"macminiPro$ "(3)使用 nano: Ctrl o (字母…

(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验二----网络分析(超超超详细!!!)

相信实验一大家已经完成了,对Arcgis已进一步熟悉了,现在开启第二个实验 ArcMap实验--网络分析 目录 ArcMap实验--网络分析 1.1 网络分析介绍 1.2 实验内容及目的 1.2.1 实验内容 1.2.2 实验目的 2.2 实验方案 2.3 实验流程 2.3.1 实验准备 2.3.2 空间校正…

云技术-docker

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团…

如何保护LabVIEW程序免遭反编译

在正常情况下,LabVIEW程序(即编译后的可执行文件或运行时文件,如 .exe 或 .llb)无法直接被反编译出源码。然而,有一些需要特别注意的点: 1. LabVIEW的编译机制 LabVIEW编译器会将源码(.vi文件&a…

C++自动化测试:GTest 与 GitLab CI/CD 的完美融合

在现代软件开发中,自动化测试是保证代码质量和稳定性的关键手段。对于C项目而言,自动化测试尤为重要,它能有效捕捉代码中的潜在缺陷,提高代码的可维护性和可靠性。本文将重点介绍如何在C项目中结合使用Google Test(GTe…

速度革命:esbuild如何改变前端构建游戏 (1)

什么是 esbuild? esbuild 是一款基于 Go 语言开发的 JavaScript 构建打包工具,以其卓越的性能著称。相比传统的构建工具(如 Webpack),esbuild 在打包速度上有着显著的优势,能够将打包速度提升 10 到 100 倍…

【逐行注释】自适应观测协方差R的AUKF(自适应无迹卡尔曼滤波,MATLAB语言编写),附下载链接

文章目录 自适应R的UKF逐行注释的说明运行结果部分代码各模块解释 自适应R的UKF 自适应无迹卡尔曼滤波(Adaptive Unscented Kalman Filter,AUKF)是一种用于状态估计的滤波算法。它是基于无迹卡尔曼滤波(Unscented Kalman Filter&…

实现 Browser 客户端下载 XML 文件功能

后端 使用 io.BytesIO 方法 创建一个字节缓冲区在不需要磁盘文件的情况下进行文件操作打包为 zip 压缩包(上图代码)in_memory_zip.seek(0) 数据写入ZIP后文件指针会停留在缓冲区的末尾将文件指针重置回开头make_response() 方法用于创建HTTP响应的函数.g…

几个bev模型部署常用的命令

#bevformer 相比bevfusion多了canbus(因为引入了时序注意力机制) ##迷你版数据集 python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes --version v1.0-mini ##标准版 python tools/crea…

大数据新视界 -- Hive 数据分区:精细化管理的艺术与实践(上)(7/ 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

web博客系统的自动化测试

目录 前言测试用例编写自动化脚本测试准备博客登录页相关测试用例登陆成功登录失败 博客首页相关测试用例登陆成功登录失败 博客详情页相关测试用例登录成功登录失败 博客编辑页相关测试用例登陆成功登录失败 编写测试文档测试类型内容 前言 本次测试是运用个人写的一个博客系…

Flink高可用配置(HA)

从Flink架构中我们可以看到,JobManager这个组件非常重要,是中心协调器,负责任务调度和资源管理。默认情况下,每个Flink集群只有一个JobManager实例。这会产生单点故障(SPOF):如果JobManager崩溃,则无法提交新程序,正在运行的程序也会失败。通过JobManager的高可用性,…

基于Springboot的流浪宠物管理系统

基于javaweb的流浪宠物管理系统 介绍 基于javaweb的流浪宠物管理系统的设计与实现,后端框架使用Springbootmybatis,前端框架使用Vuehrml,数据库使用mysql,使用B/S架构实现前台用户系统和后台管理员系统,和不同权限级别…

unity 绿幕抠图

1.硬件:Insta360 Link 2C摄像机 2.引用shader Shader "Demo/ChromaKey" { Properties { _MainTex("Texture", 2D) "white" {} _KeyColor("KeyColor", Color) (0,1,0,0) _TintColor(&q…

Linux中离线安装gcc

gcc在安装一些其他工具的经常用到,在此记录下如何安装gcc。 1.在线安装 yum -y install gcc 2.离线安装 2.1 获取安装包链接: https://pan.baidu.com/s/1oDvt64ByWs1w-evz5TXU7w?pwd9cfo mpfr-3.1.1-4.el7.x86_64.rpmlibmpc-1.0.1-3.el7.x86_64.rp…

继续完善wsl相关内容:基础指令

文章目录 前言一、我们需要安装wsl,这也是安装docker desktop的前提,因此我们在这篇文章里做了介绍:二、虽然我们在以安装docker desktop为目的时,不需要安装wsl的分发(distribution),但是装一个分发也是有诸多好处的:三、在使用wsl时,不建议把东西直接放到系统里,因…

GITEX GLOBAL聚焦AI创新,Soul App创始人张璐团队带来多模态社交新体验

2024年10月,全球瞩目的科技盛会GITEX GLOBAL在迪拜举行。作为全球三大IT展之一,GITEX GLOBAL一直是展示全球尖端科技的重要平台,今年吸引了全球超6700家科技企业及创新公司参展。 在此次展会中,Soul App创始人张璐团队携自主研发的多模态大模型首次在国际大型展会亮相,展示了其…

C++——map相关的oj题

前言:菜鸟写博客给自己看,我是菜鸟。 1:随机链表的复制 1.1题目要求: 1.2解题思路: 可以分两步来实现代码: ①先将示例1链表中的val值以及next的指向关系深拷贝到另一个新的链表当中 ②再处理新链表中&am…

go web单体项目 学习总结

为什么学习go 博主的主语言是Java,目前的工作也是做Java web开发,有了Java的经验后就想着再学一门语言,其实有两个原因,第一是基于兴趣,也想和Java对比下到底有什么不同,在学习go的时候让我更加了解了Java…

paimon的四种changelog模式(2)-none模式

# 请先了解input模式 环境创建 CREATE CATALOG fs_catalog WITH (typepaimon,warehousefile:/data/soft/paimon/catalog );USE CATALOG fs_catalog;drop table if exists t_changelog_none ;CREATE TABLE t_changelog_none (age BIGINT,money BIGINT,hh STRING,PRIMARY KEY (h…