当前位置: 首页 > news >正文

Java中的设计模式:实战案例分享

Java中的设计模式:实战案例分享

大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!

设计模式是软件开发中的宝贵工具,它们为常见的问题提供了经过验证的解决方案,帮助开发者编写出可维护、可扩展的代码。在Java编程中,设计模式更是发挥了重要作用。本文将分享几种常见的Java设计模式,并通过实战案例来展示它们的实际应用。

一、单例模式(Singleton Pattern)

1. 模式简介

单例模式确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局唯一实例的场景,如配置管理、日志记录等。

2. 实战案例

假设我们需要设计一个日志记录器,确保整个系统中只有一个日志记录器实例。

public class Logger {private static Logger instance;private Logger() {// 私有构造函数}public static Logger getInstance() {if (instance == null) {synchronized (Logger.class) {if (instance == null) {instance = new Logger();}}}return instance;}public void log(String message) {System.out.println(message);}
}public class Main {public static void main(String[] args) {Logger logger = Logger.getInstance();logger.log("This is a log message.");}
}

二、工厂模式(Factory Pattern)

1. 模式简介

工厂模式定义了一个创建对象的接口,但由子类决定实例化哪一个类。它通过延迟到子类来实现实例化,提供了对象创建的灵活性。

2. 实战案例

假设我们需要设计一个形状工厂,根据不同的参数生成不同的形状对象。

// 定义形状接口
interface Shape {void draw();
}// 实现具体的形状类
class Circle implements Shape {public void draw() {System.out.println("Drawing a Circle");}
}class Square implements Shape {public void draw() {System.out.println("Drawing a Square");}
}// 创建形状工厂
class ShapeFactory {public Shape getShape(String shapeType) {if (shapeType == null) {return null;}if (shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if (shapeType.equalsIgnoreCase("SQUARE")) {return new Square();}return null;}
}// 使用工厂生成对象
public class Main {public static void main(String[] args) {ShapeFactory shapeFactory = new ShapeFactory();Shape shape1 = shapeFactory.getShape("CIRCLE");shape1.draw();Shape shape2 = shapeFactory.getShape("SQUARE");shape2.draw();}
}

三、观察者模式(Observer Pattern)

1. 模式简介

观察者模式定义了对象间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。该模式常用于事件处理系统中。

2. 实战案例

假设我们设计一个新闻发布系统,当有新新闻发布时,所有订阅者都会收到通知。

import java.util.ArrayList;
import java.util.List;// 定义观察者接口
interface Observer {void update(String message);
}// 实现具体的观察者
class Subscriber implements Observer {private String name;public Subscriber(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " received: " + message);}
}// 定义被观察者接口
interface Subject {void attach(Observer observer);void detach(Observer observer);void notifyObservers();
}// 实现具体的被观察者
class NewsPublisher implements Subject {private List<Observer> observers = new ArrayList<>();private String news;public void setNews(String news) {this.news = news;notifyObservers();}@Overridepublic void attach(Observer observer) {observers.add(observer);}@Overridepublic void detach(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(news);}}
}// 使用观察者模式
public class Main {public static void main(String[] args) {NewsPublisher publisher = new NewsPublisher();Subscriber subscriber1 = new Subscriber("Alice");Subscriber subscriber2 = new Subscriber("Bob");publisher.attach(subscriber1);publisher.attach(subscriber2);publisher.setNews("Breaking News: Java Design Patterns are awesome!");publisher.detach(subscriber1);publisher.setNews("Update: Observer Pattern in action!");}
}

四、策略模式(Strategy Pattern)

1. 模式简介

策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式使得算法可以独立于使用它的客户端变化。

2. 实战案例

假设我们设计一个支付系统,可以根据不同的支付方式(如信用卡、PayPal)来执行支付操作。

// 定义支付策略接口
interface PaymentStrategy {void pay(int amount);
}// 实现具体的支付策略
class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(int amount) {System.out.println("Paid " + amount + " using Credit Card");}
}class PayPalPayment implements PaymentStrategy {@Overridepublic void pay(int amount) {System.out.println("Paid " + amount + " using PayPal");}
}// 创建上下文使用策略
class ShoppingCart {private PaymentStrategy paymentStrategy;public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void checkout(int amount) {paymentStrategy.pay(amount);}
}// 使用策略模式
public class Main {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();cart.setPaymentStrategy(new CreditCardPayment());cart.checkout(100);cart.setPaymentStrategy(new PayPalPayment());cart.checkout(200);}
}

五、总结

设计模式为软件开发提供了一套最佳实践,帮助开发者编写出高质量、易维护的代码。本文分享了单例模式、工厂模式、观察者模式和策略模式的实战案例,展示了这些模式在实际项目中的应用。掌握并正确应用设计模式,可以大大提高开发效率和代码质量。

感谢大家的阅读,如果您有任何疑问或建议,欢迎留言讨论!

相关文章:

Java中的设计模式:实战案例分享

Java中的设计模式&#xff1a;实战案例分享 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 设计模式是软件开发中的宝贵工具&#xff0c;它们为常见的问题提供…...

并发编程理论基础——合适的线程数量和安全的局部变量(十)

多线程的提升方向 主要方向在于优化算法和将硬件的性能发挥到极致想要发挥出更多的硬件性能&#xff0c;最主要的就是提升I/O的利用率和CPU的利用率以及综合利用率操作系统已经解决了磁盘和网卡的利用率问题&#xff0c;利用中断机制还能避免 CPU 轮询 I/O 状态&#xff0c;也提…...

Python使用抽象工厂模式和策略模式的组合实现生成指定长度的随机数

设计模式选择理由&#xff1a; 抽象工厂模式&#xff1a; 抽象工厂模式适合于创建一组相关或依赖对象的场景。在这里&#xff0c;我们可以定义一个抽象工厂来创建不同类型&#xff08;数字、字母、特殊符号&#xff09;的随机数据生成器。 策略模式&#xff1a; 策略模式允许你…...

python-17-零基础自学python-

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; 类、子类、继承、调用函数 练习内容&#xff1a; 练习9-6&#xff1a;冰激凌小店 冰激凌小店是一种特殊的餐馆。编写一个名为IceCreamStand的类&#xff0c;让它继承为完成练习9-1或…...

Web应用和Tomcat的集成鉴权1-BasicAuthentication

作者:私语茶馆 1.Web应用与Tomcat的集成式鉴权 Web应用部署在Tomcat时,一般有三层鉴权: (1)操作系统鉴权 (2)Tomcat容器层鉴权 (3)应用层鉴权 操作系统层鉴权包括但不限于:Tomcat可以和Windows的域鉴权集成,这个适合企业级的统一管理。也可以在Tomcat和应用层独立…...

解决Linux下Java应用因内存不足而崩溃的问题

在Linux系统中运行内存密集型的Java应用时&#xff0c;经常会遇到因系统内存不足而导致应用崩溃的问题。本文将探讨如何诊断这类问题以及提供有效的解决方案。 问题诊断 首先&#xff0c;使用 free -h 命令查看系统的内存使用情况&#xff0c;得到以下输出&#xff1a; total…...

ardupilot开发 --- 视觉伺服 篇

风驰电掣云端飘&#xff0c;相机无法对上焦 1.视觉伺服分类2.视觉伺服中的坐标系3.成像模型推导4.IBVS理论推导5.IBVS面临的挑战6.visp 实践参考文献 1.视觉伺服分类 控制量是在图像空间中推导得到还是在欧式空间中推导得到&#xff0c;视觉伺服又可以分类为基于位置(PBVS)和基…...

KVM配置嵌套虚拟化

按照以下步骤启用、配置和开始使用嵌套虚拟化,默认情况下禁用该功能,要启用它,请在宿主机物理机上进行配置。在centos stream 9和ubuntu 22部署kvm默认支持虚拟机嵌套虚拟化。 1、英特尔 1.1检查嵌套虚拟化在您的主机系统上是否可用 $cat /sys/module/kvm_intel/paramete…...

Springboot应用的信创适配-补充

Springboot应用的信创适配-CSDN博客 因为篇幅限制&#xff0c;这里补全Spring信创适配、数据库信创适配、Redis信创适配、消息队列信创适配等四个章节。 Springboot应用的信创适配 Springboot应用的信创适配&#xff0c;如上图所示需要适配的很多&#xff0c;从硬件、操作系统、…...

制图工具(14)导出图层字段属性信息表

在制图工具&#xff08;13&#xff09;地理数据库初始化工具中我们提到&#xff0c;有一个参数为&#xff1a;“输入Excel表”&#xff0c;并要求表格中的图层字段属性项需要按工具的帮助文档中的示例进行组织… 如下图&#xff1a; 此外&#xff0c;总有那个一个特别的需求&am…...

代码随想录——买股票的最佳时机Ⅱ(Leecode122)

添加链接描述 贪心 局部最优&#xff1a;手机每天的正利润 全局最优&#xff1a;求最大利润 class Solution {public int maxProfit(int[] prices) {int res 0;for(int i 1; i < prices.length; i){res Math.max(prices[i] - prices[i - 1], 0);}return res;} }...

使用Servlet开发javaweb,请求常见错误详解及其解决办法【404、405、500】

Servlet报错的情况多种多样&#xff0c;涵盖了配置错误、代码逻辑错误、资源未找到、权限问题等多个方面。以下是一些常见的Servlet报错情况及其可能的原因和解决方法&#xff1a; 404 Not Found: 错误原因图示&#xff1a; URL映射 发送请求&#xff0c;出现404错误 原因: 请…...

数据库管理-第210期 HaloDB-Oracle兼容性测试02(20240622)

数据库管理210期 2024-06-22 数据库管理-第210期 HaloDB-Oracle兼容性测试02&#xff08;20240622&#xff09;1 表增加列2 约束3 自增列4 虚拟列5 表注释6 truncat表总结 数据库管理-第210期 HaloDB-Oracle兼容性测试02&#xff08;20240622&#xff09; 作者&#xff1a;胖头…...

SpringBoot实现定时任务的动态停止和更新

目录 定时任务管理器定时任务的任务接口定时任务和定时任务结果的缓存对象定时任务使用姿势 定时任务管理器 负责启动一个定时任务、停止一个定时任务、更新一个定时任务 /*** 定时任务管理器* 1、创建并启动一个定时任务* 2、停止一个定时任务* 3、更新一个定时任务*/ publi…...

【threejs】火焰特效制作

2024-06-26 08-57-16火焰 shader 来源 //shadertory&#xff1a;https://www.shadertoy.com/view/ctVGD1//shadertory&#xff1a;https://www.shadertoy.com/view/ml3GWs 代码 import { DoubleSide, ShaderChunk, ShaderMaterial } from "three";export default fu…...

五原则四实践,REST API安全性请谨记

云原生和微服务架构等技术的流行让API受到越来越大的重视。那么当应用程序开始上云&#xff0c;各项需求都可以通过云服务满足的情况下&#xff0c;应用程序&#xff0c;尤其基于云端API的应用程序的安全问题该如何解决&#xff1f; 表现层状态转移&#xff08;REST&#xff0…...

1390:食物链【NOI2001】

【解题思路】 并查集把三类动物划分成三个域&#xff0c;同类域&#xff08;1-n&#xff09;、捕食域〈n1-2n&#xff09;、天敌域&#xff08;2n1-3n&#xff09;。把x放入同类域&#xff0c;xn放入其捕食域&#xff0c;x2n放入其天敌域。给在其他集合内安插两个“虚拟代表”…...

ICMAN液位检测——WS003B管道检测模组

ICMAN液位检测之WS003B管道检测模组 体积小&#xff0c;成本低&#xff0c; 液位检测精度高&#xff0c; 有水输出低电平无水高电平&#xff0c; 适用于饮水机、咖啡机、扫地机器人、洗地机等&#xff0c; 有需要朋友快联系我吧&#xff01; AWE展会不容错过的ICMAN检测模组…...

YOLOv10使用教程及导读

首先推荐一下我的YOLOv8/v10项目&#xff0c;仅需一个v8的钱&#xff08;69.9&#xff09;&#xff0c;付费进群&#xff0c;即可获取v8/v10的全部改进&#xff0c;欢迎进群。 1 YOLOv10简介 论文链接&#xff1a;https://arxiv.org/pdf/2405.14458 官方代码链接&#xff1a;ht…...

AIGC 在前端流式获取内容SSE

AIGC 在前端流式获取内容SSE 简介具体实现 简介 在 OpenAI 的 API 中&#xff0c;SSE 通常用于实现实时数据传输。例如&#xff0c;在聊天模型&#xff08;如 ChatGPT&#xff09;中&#xff0c;使用 SSE 可以让客户端实时接收到生成的对话内容&#xff0c;而不需要等待整个响…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

js 比较两个对象的值,不相等就push对象的key

在JavaScript中&#xff0c;比较两个对象&#xff08;object&#xff09;的值并找出不相等的key&#xff0c;可以通过多种方法实现。下面是一些常用的方法&#xff1a; 方法1&#xff1a;使用JSON.stringify 这种方法适用于简单的对象&#xff0c;其中对象的值是基本类型或可…...

git引用概念(git reference,git ref)(简化对复杂SHA-1哈希值的管理)(分支引用、标签引用、HEAD引用、远程引用、特殊引用)

文章目录 **引用的本质**1. **引用是文件**2. **引用的简化作用** **引用的类型**1. **分支引用&#xff08;Branch References&#xff09;**2. **标签引用&#xff08;Tag References&#xff09;**3. **HEAD 引用**4. **远程引用&#xff08;Remote References&#xff09;*…...