Java 设计模式及应用场景

Java 设计模式是解决软件开发中常见问题的通用方案,通过合理的设计模式可以提高代码的可维护性、可扩展性和复用性。下面将介绍 Java 中常见的设计模式及其原理。

一、设计模式的分类

设计模式主要分为三大类,共 23 种经典模式:

  1. 创建型模式(5 种):用于对象的创建过程,如单例模式、工厂模式等。
  2. 结构型模式(7 种):用于处理类或对象的组合,如代理模式、装饰器模式等。
  3. 行为型模式(11 种):用于处理对象之间的交互和职责分配,如观察者模式、策略模式等。

二、常见设计模式详解

1. 单例模式(Singleton)

原理:确保一个类只有一个实例,并提供全局访问点。
实现方式

  • 饿汉式(线程安全,类加载时初始化):
    public class Singleton {private static final Singleton INSTANCE = new Singleton();private Singleton() {}public static Singleton getInstance() {return INSTANCE;}
    }
    
  • 懒汉式(延迟初始化,需注意线程安全):
    public class Singleton {private static volatile Singleton instance; // 防止指令重排序private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
    }
    

应用场景:配置管理器、数据库连接池等。

2. 工厂模式(Factory)

原理:定义创建对象的接口,让子类决定实例化哪个类。
分类

  • 简单工厂(非标准模式):
    public class ShapeFactory {public Shape createShape(String type) {if ("circle".equals(type)) {return new Circle();} else if ("rectangle".equals(type)) {return new Rectangle();}return null;}
    }
    
  • 工厂方法
    public interface ShapeFactory {Shape createShape();
    }public class CircleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
    }
    

应用场景:根据不同条件创建对象,如游戏中的角色创建。

3. 观察者模式(Observer)

原理:定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会收到通知并自动更新。
结构

  • 主题(Subject):维护观察者列表,提供注册和删除观察者的方法。
  • 观察者(Observer):定义更新接口。
    // 主题接口
    public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
    }// 观察者接口
    public interface Observer {void update(String message);
    }
    

应用场景:事件监听、消息推送等。

4. 装饰器模式(Decorator)

原理:动态地给对象添加额外职责,比继承更灵活。
结构

  • 组件接口(Component):定义核心功能。
  • 具体组件(ConcreteComponent):实现核心功能。
  • 装饰器(Decorator):持有组件引用,扩展功能
    // 组件接口
    public interface Beverage {String getDescription();double cost();
    }// 具体组件
    public class Espresso implements Beverage {@Overridepublic String getDescription() {return "Espresso";}@Overridepublic double cost() {return 1.99;}
    }// 装饰器
    public abstract class CondimentDecorator implements Beverage {protected Beverage beverage;public CondimentDecorator(Beverage beverage) {this.beverage = beverage;}
    }
    

应用场景:IO 流(如BufferedInputStream装饰FileInputStream)。

5. 策略模式(Strategy)

原理:定义一系列算法,将每个算法封装起来,并使它们可以互换。
结构

  • 策略接口(Strategy):定义算法行为。
  • 具体策略(ConcreteStrategy):实现策略接口。
  • 上下文(Context):持有策略引用,根据需要选择策略。
    示例
    // 策略接口
    public interface SortStrategy {void sort(int[] arr);
    }// 具体策略
    public class BubbleSort implements SortStrategy {@Overridepublic void sort(int[] arr) {// 冒泡排序实现}
    }// 上下文
    public class SortContext {private SortStrategy strategy;public SortContext(SortStrategy strategy) {this.strategy = strategy;}public void executeSort(int[] arr) {strategy.sort(arr);}
    }
    

应用场景:根据运行时条件选择算法,如支付方式选择。

三、设计模式的六大原则

设计模式的核心思想是遵循以下六大原则:

  1. 单一职责原则(SRP):一个类只负责一项职责。
  2. 开闭原则(OCP):对扩展开放,对修改关闭。
  3. 里氏替换原则(LSP):子类可以替换父类而不影响程序正确性。
  4. 依赖倒置原则(DIP):依赖抽象而非具体实现。
  5. 接口隔离原则(ISP):客户端不应该依赖它不需要的接口。
  6. 迪米特法则(LoD):一个对象应该对其他对象保持最少的了解。

四、设计模式的应用场景

  • 创建型模式:对象创建过程复杂时,如单例模式、工厂模式。
  • 结构型模式:需要优化类结构时,如代理模式(AOP 实现)、适配器模式(兼容不同接口)。
  • 行为型模式:处理对象间交互时,如观察者模式(事件驱动)、状态模式(状态机)。

五、总结

设计模式是软件开发的经验总结,掌握常见模式可以提高代码质量和开发效率。关键是理解模式背后的设计原则,并根据实际需求合理选择和应用模式,避免过度设计。

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

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

相关文章

GitHub Jekyll博客本地Win开发环境搭建

GitHub Jekyll博客本地Win开发环境搭建 标签 后端 blog jekyll 全文链接 GitHub Jekyll博客本地Win开发环境搭建 概述 本文详细介绍了在Windows系统上搭建Jekyll博客本地开发环境的完整步骤,为GitHub Pages博客开发提供本地预览和调试能力。 环境依赖 Ruby环…

浏览器防录屏是怎样提高视频安全性?

文章目录前言一、什么是浏览器防录屏二、浏览器防录屏的原理是什么?(javascript)三、如何实现浏览器防录屏总结前言 在数字内容版权保护面临严峻挑战的今天,浏览器防录屏技术作为视频安全体系的关键一环,其重要性日益…

uni-app项目配置通用链接拉起ios应用android应用

uniapp开发ios&android可拉起app的辛酸历程IOS配置指南1、登录[apple Developer](https://developer.apple.com/account/resources/identifiers/list)账户找到自己开发的对应的项目2、确保对应项目的Associated Domains是打开状态3、本地创建一个 apple-app-site-associati…

deep learning(李宏毅)--(六)--loss

一,关于分类问题及其损失函数的一些讨论。 在构建分类模型是,我们的最后一层往往是softmax函数(起到归一化的作用),如果是二分类问题也可以用sigmoid函数。 在loss函数的选择上,一般采用交叉熵损失函数(…

Python绑定及其在Mujoco仿真器中的作用

好的,这是一个非常核心且重要的问题。我来分两部分为你详细解释:首先是“什么是Python绑定”,然后是“它在MuJoCo中具体的作用”。第一部分:什么是Python绑定 (Python Binding)? 简单来说,Python绑定是一座…

数学建模从入门到国奖——备赛规划优秀论文学习方法

数学建模从入门到国奖——备赛规划 数学建模国一:我的逆袭经验分享在大二,我们团队初次参加妈妈杯,遗憾未获奖,后来经过5个月的时间,在大三上学期的9月,我们团队以C题数据挖掘机器学习创新斩获国赛一等奖&a…

大型语言模型的白日梦循环

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

【Gaussian Haircut论文】在Deepseek和Chatgpt的帮助下慢速了解核心方法

3.Method 一、 1.核心目标 输入:多张从不同角度拍摄的头发照片。输出:3D发型模型,且模型由发丝构成(即每根头发被建模为独立的曲线/线段,而非体积/网络)。 2.数据预处理 在正式重建前,需要从输入…

众趣SDK重磅升级:空间物联IOT新视界,赋能实景三维场景深度应用

近日,空间数字孪生云服务行业领导者—众趣科技宣布旗下核心产品云服务平台Qverse SDK迎来里程碑式升级!本次升级聚焦行业前沿需求,重磅推出IoT设备监控系统、iframe跨平台页面无缝集成、BI数据智能三大解决方案,旨在将三维空间计算…

021_自然语言处理应用

自然语言处理应用 目录 NLP应用概述文本理解技术文本生成应用语言分析工具多语言处理专业领域应用实践案例 NLP应用概述 核心能力范围 文本理解 语义理解:深度理解文本含义和上下文实体识别:识别人名、地名、机构名等命名实体关系提取:…

小程序中状态管理Redux

Redux 是一个 集中式 状态管理框架,所有状态存储在一个 全局 Store 中,并通过 Action 触发 Reducer 进行数据更新。。1.安装npm install redux miniprogram-computed2.创建// store.js import { createStore } from "redux";// 定义初始状态 c…

c++:类型转换函数

简介 在C++中,类型转换运算符(也称为类型转换函数或转换函数)是一种特殊的成员函数,它允许将一个类类型的对象转换为其他类型。转换运算符的声明形式如下: operator type() const; 关键点 ​​声明​​:在类内部声明,没有返回类型(因为type已经表示了返回类型),没…

Java 8 jdk1.8下载及安装教程和环境变量配置

1. 概述 本文介绍如何在 Windows 10 系统下下载并安装 Java 开发工具包(JDK 1.8),适合 Java 初学者或需要搭建开发环境的用户。 2. 安装包下载 2.1 安装包获取 由于 Oracle 官网下载需注册登录,可选择以下替代方式获取 JDK 安装…

git@github.com: Permission denied (publickey).

摘要:记录新电脑需要clone和push代码到GitHub error: Cloning into FPGA_common… gitgithub.com: Permission denied (publickey). fatal: Could not read from remote repository. 遇到的这个错误信息: gitgithub.com: Permission denied…

【Linux基础知识系列】第五十四篇 - 网络协议基础:TCP/IP

在网络通信中,TCP/IP 协议是实现设备之间数据传输的基础。TCP/IP 协议栈定义了数据在网络中传输的方式,从应用层到网络层,再到物理层,每一层都有其特定的功能和协议。理解 TCP/IP 协议的基本概念和工作原理,对于网络管…

《python语言程序设计》2018版第8章8题编写函数实现二进制转十进制(字符串变整数)!!整数没法进行下标

二进制转十进制前言第1章幻想的草稿第2章如何把这些幻想的数字带到现实的算式中第3章看来是我想多了第4章 空值不一定是最好的选择第5章 成功了前言 将字符串变成整数,但是整数没法像字符串一样做下标 反复尝试最好的手段,是多多打印 第1章幻想的草稿 …

LeetCode20

一个新手小白开始算法的学习之路,以后会不定期分享个人做完一些题目的笔记,使用语言为JavaScript//声明一个名为isValid的函数,接收一个参数s(要检查的字符串) let isValid function(s) {//初始化栈//创建一个空数组s…

Spring Boot 自动配置:从 spring.factories 到 AutoConfiguration.imports 的演变

引言 Spring Boot 的自动配置机制是其【开箱即用】特性的核心支撑,通过减少显式配置和简化开发流程,显著提升了开发效率。随着 Spring Boot 版本的迭代,自动配置的实现机制也在不断优化。本文将深入解析 spring.factories 和 AutoConfigurat…

Redis7 底层数据结构解析

Redis底层数据结构深度解析(基于Redis 7.2.5)本文深入剖析Redis核心数据类型的底层实现机制,涵盖String、Hash、List、Set、Zset的实现原理及版本演进差异。一、Redis数据存储核心机制 Redis所有数据以redisObject结构统一封装: t…