Java常见设计模式入门与实践

设计模式是软件开发中被反复应用的、为解决特定问题而总结出的最佳实践。它们提供了开发可重用、灵活和高效软件系统的方法。在Java中,设计模式可以帮助开发者编写更高质量的代码。以下是Java中一些常用设计模式的入门介绍及其实践示例。

1. 单例模式 (Singleton Pattern)

单例模式确保一个类只有一个实例,并提供一个全局访问点。

示例代码
public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数防止实例化}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

2. 工厂模式 (Factory Pattern)

工厂模式定义一个创建对象的接口,但让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。

示例代码
// 产品接口
public interface Product {void use();
}// 具体产品类
public class ConcreteProduct implements Product {@Overridepublic void use() {System.out.println("Using ConcreteProduct");}
}// 工厂类
public class Factory {public Product createProduct() {return new ConcreteProduct();}
}// 客户端代码
public class Main {public static void main(String[] args) {Factory factory = new Factory();Product product = factory.createProduct();product.use();}
}

3. 观察者模式 (Observer Pattern)

观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

示例代码
import java.util.ArrayList;
import java.util.List;// 观察者接口
interface Observer {void update(String message);
}// 具体观察者类
class ConcreteObserver implements Observer {private String name;public ConcreteObserver(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " received: " + message);}
}// 被观察者接口
interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();
}// 具体被观察者类
class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();private String message;public void setMessage(String message) {this.message = message;notifyObservers();}@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(message);}}
}// 客户端代码
public class Main {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();Observer observer1 = new ConcreteObserver("Observer 1");Observer observer2 = new ConcreteObserver("Observer 2");subject.registerObserver(observer1);subject.registerObserver(observer2);subject.setMessage("Hello, Observers!");}
}

4. 策略模式 (Strategy Pattern)

策略模式定义了算法家族,并且使它们之间可以互相替换。策略模式让算法的变化独立于使用算法的客户。

示例代码
// 策略接口
interface Strategy {int doOperation(int num1, int num2);
}// 具体策略类
class Addition implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}class Subtraction implements Strategy {@Overridepublic 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);}
}// 客户端代码
public class Main {public static void main(String[] args) {Context context = new Context(new Addition());System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context = new Context(new Subtraction());System.out.println("10 - 5 = " + context.executeStrategy(10, 5));}
}

5. 装饰者模式 (Decorator Pattern)

装饰者模式动态地将责任附加到对象上。装饰者提供了比继承更有弹性的替代方案。

示例代码
// 组件接口
interface Component {void operation();
}// 具体组件类
class ConcreteComponent implements Component {@Overridepublic void operation() {System.out.println("ConcreteComponent operation");}
}// 装饰者抽象类
abstract class Decorator implements Component {protected Component component;public Decorator(Component component) {this.component = component;}public void operation() {component.operation();}
}// 具体装饰者类
class ConcreteDecorator extends Decorator {public ConcreteDecorator(Component component) {super(component);}@Overridepublic void operation() {super.operation();addedBehavior();}private void addedBehavior() {System.out.println("ConcreteDecorator added behavior");}
}// 客户端代码
public class Main {public static void main(String[] args) {Component component = new ConcreteComponent();Component decorator = new ConcreteDecorator(component);decorator.operation();}
}

总结

以上是一些常用设计模式的入门介绍及其Java实现示例。掌握这些设计模式有助于编写更加可维护、灵活和高效的代码。设计模式不仅仅是代码模板,更是一种思维方式,可以帮助开发者在面临复杂问题时找到最佳解决方案。通过不断的学习和实践,可以更好地理解和应用这些设计模式。

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

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

相关文章

什么是 WebXR Device API?

WebXR Device API&#xff08;简称 WebXR&#xff09;是由万维网联盟&#xff08;W3C&#xff09;开发的一组 API&#xff0c;允许 web 应用访问 XR 硬件设备的功能&#xff0c;包括头戴式显示器&#xff08;HMD&#xff09;、手柄、传感器等。通过这些 API&#xff0c;开发者可…

24年最新版基础入门大模型辅助Python编程指南

今天这篇文章只会聊 Python 入门基础&#xff0c;如何通过大模型辅助Python 编程&#xff0c;在 后续的文章里慢慢聊。 一点点 python都不会。又想用大模型带飞&#xff0c;辅助 python 编程&#xff0c;提升数据分析能力和效率&#xff0c;怎么办&#xff1f; 一点都不需要担…

大数据数仓30问

基础概念篇 什么是数据仓库&#xff08;Data Warehouse&#xff09;&#xff1f;它与传统数据库的区别是什么&#xff1f; 数据仓库中的OLAP&#xff08;在线分析处理&#xff09;和OLTP&#xff08;在线事务处理&#xff09;有什么区别&#xff1f; 解释一下数据仓库的三层架…

孟德尔随机化R包:TwoSampleMR和MR-PRESSO安装

1. 孟德尔随机化R包 看一篇文章&#xff0c;介绍孟德尔随机化分析&#xff0c;里面推荐了这两个R包&#xff0c;安装了解一下&#xff1a; Methods:Genome-wide association study (GWAS) data for autoimmune diseases and AMD were obtained from the IEU Open GWAS databas…

Three.js动效(第12辑):效果炫酷,但性能问题突出,如何破?

Three.js是一款强大的3D渲染引擎&#xff0c;但是在处理大量数据时&#xff0c;可能会出现性能问题。贝格前端工场结合过往经验&#xff0c;给大家几条性能优化的建议。 1. 减少渲染次数&#xff1a; 可以通过合并对象、使用InstancedMesh等方式减少渲染次数&#xff0c;从而…

XML XSLT:技术与应用解析

XML XSLT&#xff1a;技术与应用解析 XML&#xff08;可扩展标记语言&#xff09;和XSLT&#xff08;XML样式表转换语言&#xff09;是现代信息技术中不可或缺的工具。本文将深入探讨XML和XSLT的概念、技术细节以及它们在实际应用中的作用。 XML简介 XML是一种用于存储和传输…

Nginx+keepalived实现高可用

目录 主要功能 典型应用场景 优点 keepalived工作原理 Nginxkeepalived高可用实验 一. 环境准备 二. 下载并部署配置 对master和backup都操作 对master主机操作 对备用backup主机进行操作 验证当主节挂掉&#xff0c;VIP能否转义到备用机 "Keepalived" …

事件委托是什么

利用事件冒泡的原理&#xff0c;让自己的所触发的事件&#xff0c;让他的父元素代替执行&#xff01; 1、那什么样的事件可以用事件委托&#xff0c;什么样的事件不可以用呢&#xff1f; 适合用事件委托的事件&#xff1a;click&#xff0c;mousedown&#xff0c;mouseup&…

SpringBoot+Vue实现Excel文档导入和导出

1.准备工作 1.1.前端程序 在前端首先加上批量导出的按钮&#xff0c;如下 <el-button size"small" type"warning" plain click"exportData"> 批量导出 </el-button> 在添加了点击事件之后&#xff0c;在methods中要与之对应的添加上…

c#引用dll报错cs8370功能“本地函数特性“在c#7.3中不可用

cs8370:功能"本地函数特性"在c#7.3中不可用 解决方法&#xff1a; 代码放在form类里面

SJ703安全帽防静电测试仪

一、仪器用途 专门检测安全帽防静电性能。 二、仪器特征 1、携带使用轻便、量程宽广、读数准确&#xff0c;耐震性强等卓越优点 2、超上限时显示‘1’提示和低于下限时声响报警。 3、电池欠压时显示欠压符号“←”提示。 4、交流或直流&#xff08;电池&#xff09;供电任…

【Vue3】使用v-model实现父子组件通信(常用在组件封装规范中)

历史小剧场 历史告诉我们&#xff0c;痞子就算混一辈子&#xff0c;也还是痞子&#xff0c;滑头&#xff0c;最后只能滑自己。长得帅&#xff0c;不能当饭吃。 成大器者的唯一要诀&#xff0c;是能吃亏。 吃亏就是占便宜&#xff0c;原先我不信&#xff0c;后来我信了&#xff…

Oracle数据库之多行函数(十九)

Oracle多行函数&#xff08;也称为聚合函数或组函数&#xff09;作用于一组数据&#xff0c;并对该组数据返回一个单一的值。这些函数在处理分组数据或对整个表进行汇总操作时非常有用。以下是一些常见的Oracle多行函数及其描述&#xff1a; 1. AVG 功能&#xff1a;计算某列…

Java17 --- RabbitMQ之插件使用

目录 一、Federation插件 1.1、运行两个rabbitmq实例 1.2、启用插件 1.3、在下游端点添加上游端点 1.4、创建策略 1.6、测试 二、联邦队列 2.1、创建策略 2.2、创建交换机与队列 2.2.1、创建52000的队列与交换机 2.2.2、创建62000的队列 三、Shovel 3.1、启…

Echats-wordcloud 文字云图的踩坑点【Unknown series wordCloud】

在词云渲染时遇到渲染不出来的问题&#xff1a; 原因分析&#xff1a; 1、echart和wordcloud版本不匹配&#xff08;我的是匹配的&#xff09; 解决方案&#xff1a; 1、echart和wordcloud版本要匹配&#xff1a; echart4x 使用wordcloud1x版本 echart5x 使用wordcloud2x版本…

Echarts图表: 矩形树图都有哪些配置项,一文告诉你

Hello&#xff0c;本期和大家分享矩形树图的配置项&#xff0c;欢迎评论区和贝格前端工场互动交流。 一、矩形树图是什么 矩形树图是ECharts中的一种图表类型&#xff0c;用于展示树形结构的数据。矩形树图通过矩形的大小和位置来表示树形结构中节点的层次关系和数据的大小。…

C语言:头歌计算两数的和与差

任务描述 本关任务&#xff1a;本题要求实现一个计算输入的两数的和与差的简单函数。 函数接口定义&#xff1a; void sum_diff( float op1, float op2, float *psum, float *pdiff ); 其中op1和op2是输入的两个实数&#xff0c;*psum和*pdiff是计算得出的和与差。 主程序样…

实例化游戏物体的实例(生成游戏物体)

一、实例1&#xff1a;实例化 1、准备工作&#xff1a;制备预制体&#xff0c;命名。如Circle 2、Create Empty&#xff0c;名字自取。如&#xff1a;CirclePrefab 3、给CirclePrefab添加Test.cs public GameObject CirclePrefab; // 预制体变量&#xff0c;用于存储Circle预…

基于matlab的MTCNN(多任务卷积神经网络)人脸检测算法

关键词&#xff1a;Matlab&#xff1b;深度学习&#xff1b;多任务卷积神经网络&#xff1b;人脸检测&#xff1b; 背景 在不受约束的环境中&#xff0c;由于个体姿势的多样性、光照条件的变化以及潜在的遮挡问题&#xff0c;人脸检测和对齐任务面临诸多挑战。近期的研究表明…

ad18学习笔记22:关于keep out layer禁止布线层

ad18里的新特性&#xff0c;在 keep out层无法直接放置线条&#xff0c;需要去菜单-放置-keepout进行画线&#xff0c;如果&#xff0c;在其他层画了一个图形&#xff0c;无法直接修改这个图形的属性&#xff0c;把他变为keepout的线条&#xff0c;但是可以通过特殊粘贴操作&am…