浅谈Java常见设计模式及实例

前言

Java 中常用的设计模式有很多种,其实平常用到的还比较少,但是还是有必要了解一下,可以按照实际情况运用到我们的代码中。按照类型可以基本分解为,创建型模式、结构型模式和行为型模式。

创建型模式 (Creational Patterns)


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

定义一个创建对象的接口,但是将实际的创建工作交给子类来实现。
考虑一个简单的工厂方法,生产不同类型的形状对象:

  interface Shape {void draw();}class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}}class ShapeFactory {public Shape getShape(String shapeType) {if (shapeType == null) {return null;}if (shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {return new Rectangle();}return null;}}


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

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
考虑一个抽象工厂,生产不同类型的形状和颜色对象的组合:

   interface Shape {void draw();}interface Color {void fill();}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}}class Blue implements Color {@Overridepublic void fill() {System.out.println("Inside Blue::fill() method.");}}abstract class AbstractFactory {abstract Shape getShape(String shapeType);abstract Color getColor(String colorType);}class ShapeFactory extends AbstractFactory {@OverrideShape getShape(String shapeType) {if (shapeType.equalsIgnoreCase("RECTANGLE")) {return new Rectangle();}return null;}@OverrideColor getColor(String colorType) {return null;}}class ColorFactory extends AbstractFactory {@OverrideShape getShape(String shapeType) {return null;}@OverrideColor getColor(String colorType) {if (colorType.equalsIgnoreCase("BLUE")) {return new Blue();}return null;}}

3. 建造者模式 (Builder Pattern)

将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
考虑一个简单的食物构建器,可以构建汉堡和冷饮:

    class Burger {private String size;private boolean cheese;private boolean pepperoni;private boolean lettuce;public Burger(BurgerBuilder builder) {this.size = builder.size;this.cheese = builder.cheese;this.pepperoni = builder.pepperoni;this.lettuce = builder.lettuce;}static class BurgerBuilder {private String size;private boolean cheese;private boolean pepperoni;private boolean lettuce;public BurgerBuilder(String size) {this.size = size;}public BurgerBuilder cheese(boolean cheese) {this.cheese = cheese;return this;}public BurgerBuilder pepperoni(boolean pepperoni) {this.pepperoni = pepperoni;return this;}public BurgerBuilder lettuce(boolean lettuce) {this.lettuce = lettuce;return this;}public Burger build() {return new Burger(this);}}}


4. 单例模式 (Singleton Pattern)

确保一个类只有一个实例,并提供一个全局访问点。
实现一个线程安全的懒汉式单例:

     public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}}


 

结构型模式 (Structural Patterns)


1.适配器模式 (Adapter Pattern)

将一个类的接口转换成客户端希望的另一个接口。
使用适配器让美国插头可以插入英国插座:

 interface UKPlug {void provideElectricity();}class UKSocket implements UKPlug {@Overridepublic void provideElectricity() {System.out.println("Providing electricity with UK plug.");}}interface USPlug {void supplyElectricity();}class USPlugConnector implements USPlug {@Overridepublic void supplyElectricity() {System.out.println("Supplying electricity with US plug.");}}class USPlugAdapter implements UKPlug {private USPlug plug;public USPlugAdapter(USPlug plug) {this.plug = plug;}@Overridepublic void provideElectricity() {plug.supplyElectricity();}}


2. 桥接模式 (Bridge Pattern)

将抽象部分与它的实现部分分离,使它们可以独立地变化。
将不同颜色的笔与不同类型的绘图设备连接起来:

  interface DrawAPI {void draw();}abstract class Shape {protected DrawAPI drawAPI;protected Shape(DrawAPI drawAPI) {this.drawAPI = drawAPI;}abstract void draw();}class Circle extends Shape {private int x, y, radius;public Circle(int x, int y, int radius, DrawAPI drawAPI) {super(drawAPI);this.x = x;this.y = y;this.radius = radius;}@Overridevoid draw() {drawAPI.draw();}}

3. 组合模式 (Composite Pattern)

将对象组合成树形结构以表示“部分-整体”的层次结构。
用组合模式表示员工的层级结构:

     import java.util.ArrayList;import java.util.List;class Employee {private String name;private String dept;private int salary;private List<Employee> subordinates;public Employee(String name, String dept, int sal) {this.name = name;this.dept = dept;this.salary = sal;subordinates = new ArrayList<Employee>();}public void add(Employee e) {subordinates.add(e);}public void remove(Employee e) {subordinates.remove(e);}public List<Employee> getSubordinates() {return subordinates;}@Overridepublic String toString() {return ("Employee :[ Name : " + name + ", dept : " + dept + ", salary :" + salary + " ]");}}

行为型模式 (Behavioral Patterns)


1. 观察者模式 (Observer Pattern)

定义对象间的一对多依赖关系,当一个对象状态发生改变时,它的所有依赖者都会收到通知并自动更新。
实现一个简单的气象站,当气象数据发生变化时,通知所有注册的观察者:

  import java.util.ArrayList;import java.util.List;interface Observer {void update(float temperature, float humidity, float pressure);}interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();}class WeatherData implements Subject {private List<Observer> observers;private float temperature;private float humidity;private float pressure;public WeatherData() {observers = new ArrayList<>();}public void registerObserver(Observer observer) {observers.add(observer);}public void removeObserver(Observer observer) {observers.remove(observer);}public void notifyObservers() {for (Observer observer : observers) {observer.update(temperature, humidity, pressure);}}public void measurementsChanged() {notifyObservers();}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;measurementsChanged();}}


2. 状态模式 (State Pattern)

允许对象在内部状态改变时改变它的行为。
使用状态模式实现一个简单的电梯控制系统:
 

   interface State {void doAction(Context context);}class Context {private State state;public void setState(State state) {this.state = state;}public State getState() {return state;}}class StartState implements State {public void doAction(Context context) {System.out.println("Player is in start state");context.setState(this);}public String toString() {return "Start State";}}

3. 策略模式 (Strategy Pattern)

定义一系列算法,将每一个算法封装起来,并使它们可以互相替换。
实现一个简单的排序器,可以根据不同的策略选择不同的排序算法:
 

   import java.util.List;interface SortStrategy {<T extends Comparable<T>> void sort(List<T> items);}class BubbleSortStrategy implements SortStrategy {public <T extends Comparable<T>> void sort(List<T> items) {// 实现冒泡排序算法}}class QuickSortStrategy implements SortStrategy {public <T extends Comparable<T>> void sort(List<T> items) {// 实现快速排序算法}}class Sorter {private SortStrategy strategy;public Sorter(SortStrategy strategy) {this.strategy = strategy;}public <T extends Comparable<T>> void sort(List<T> items) {strategy.sort(items);}}

这只是一些常见的设计模式,Java一共有23种设计模式,实际掌握几种设计模式就可以帮助你更好地组织代码、提高代码的可维护性和可扩展性。

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

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

相关文章

JS逆向进阶篇【去哪儿旅行登录】【上篇】

目标url: aHR0cHM6Ly91c2VyLnF1bmFyLmNvbS9wYXNzcG9ydC9sb2dpbi5qc3A 实现难点&#xff1a; 逆向滑块请求发送短信登录 目录 每篇前言&#xff1a;0、前置技术栈&#xff08;1&#xff09;JS实现页面滑动&#xff08;2&#xff09;JS实现记录滑动轨迹&#xff08;3&#xff…

SAP MM学习笔记42 - 特殊调达流程 - 受托品(寄售)

上一章讲了 外注加工的知识。 详细可以参考如下链接。 SAP MM学习笔记41 - 特殊调达流程 - 外注加工-CSDN博客 咱们继续学习特殊调达流程。 本章主要讲受托品。 1&#xff0c;什么是受托品 &#xff08;寄售&#xff09; 仕入先提供的商品&#xff0c;商品是放在你公司了&a…

CSS定位装饰

网页常见布局方式 标准流 块级元素独占一行---垂直布局 行内元素/行内块元素一行显示多个----水平布局 浮动 可以让原本垂直布局的块级元素变成水平布局 定位 可以让元素自由的摆放在网页的任意位置 一般用于盒子之间的层叠情况 使用定位步骤 设置定位方式 属性名&am…

一周学会Django5 Python Web开发-Django5 Hello World编写

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计14条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

使用 C++23 从零实现 RISC-V 模拟器

&#x1f449;&#x1f3fb; 文章汇总「从零实现模拟器、操作系统、数据库、编译器…」&#xff1a;https://okaitserrj.feishu.cn/docx/R4tCdkEbsoFGnuxbho4cgW2Yntc 使用 C23 从零实现 RISC-V 模拟器 使用 C23 从零实现的 RISC-V 模拟器&#xff0c;最终的模拟器可以运行 x…

java SSM新闻管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM新闻管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…

《Java 简易速速上手小册》第8章:Java 性能优化(2024 最新版)

文章目录 8.1 性能评估工具 - 你的性能探测仪8.1.1 基础知识8.1.2 重点案例&#xff1a;使用 VisualVM 监控应用性能8.1.3 拓展案例 1&#xff1a;使用 JProfiler 分析内存泄漏8.1.4 拓展案例 2&#xff1a;使用 Gatling 进行 Web 应用压力测试 8.2 JVM 调优 - 魔法引擎的调校8…

智能汽车行业产业研究报告:4D成像毫米波雷达—自动驾驶最佳辅助

今天分享的是智能汽车系列深度研究报告&#xff1a;《智能汽车行业产业研究报告&#xff1a;4D成像毫米波雷达—自动驾驶最佳辅助》。 &#xff08;报告出品方&#xff1a;开源证券&#xff09; 报告共计&#xff1a;43页 视觉感知最佳辅助——4D 成像毫米波雷达 感知是自动…

【Python】window环境使用venv部署jupyter notebook

基础信息 执行winr&#xff0c;在输入框输入powershell: python版本&#xff1a;python -v 创建并激活虚拟环境 1、进入要创建虚拟环境的目录&#xff0c;操作示例如下&#xff1a; PS C:\Users\Administrator> cd D:\Python\weltest 2、创建虚拟环境&#xff0c;操作示…

BUGKU-WEB GET

题目描述 没有提示&#xff0c;就一个get&#xff0c;启动场景看看&#xff1a; 解题思路 显然是PHP语言解读分析代码吧写出你的payload 相关工具 略 解题步骤 进入场景分析代码 $what$_GET[what]; echo $what; if($whatflag) echo flag{****};前两句&#xff1a;使用get…

2024年最新指南:如何订阅Midjourney(详尽步骤解析)

前言&#xff1a; Midjourney是一个基于人工智能的图像生成工具&#xff0c;它使用高级算法来创建独特和复杂的图像。这个工具能够根据用户输入的文字描述生成对应的图片。Midjourney的特点在于它能够处理非常抽象或者具体的描述&#xff0c;生成高质量、富有创意的视觉内容。M…

Flaurm实现中文搜索

目录 摘要需求本文涉及环境情况如下解决方案最终效果文章其他链接&#xff1a; 摘要 Flarum本身对中文支持并不理想&#xff0c;但随着版本更新&#xff0c;逐渐加强了对中文的优化。然而在1.8.5版本&#xff0c;却还是不支持中文搜索网站文章内容。作者在检索了全网教程&#…

新概念英语第二册(64)

【New words and expressions】生词和短语&#xff08;13&#xff09; tunnel n. 隧道 port n. 港口 ventilate v. 通风 chimney n. 烟囱 sea level …

【2024年5月备考新增】《软考高项论文专题 (13)风险管理(合集)》

1 论文基础 1.1 写作要点 过程定义、作用写作要点、思路规划风险管理是定义如何实施项目风险管理活动的过程。作用:确保风险管理的水平、方法和可见度与项目风险程度相匹配,与对组织和其他干系人的重要程度相匹配。风险管理计划的内容、编写原则。结合风险管理计划其中2-3项内…

gorm day5

gorm day5 gorm更新 删除一条记录 删除一条记录时&#xff0c;删除对象需要指定主键&#xff0c;否则会出发批量Delete&#xff0c;例如 // Email 的 ID 是 10 db.Delete(&email) // DELETE from emails where id 10;// 带额外条件的删除 db.Where("name ?"…

数模.SI模型SI的四种扩展

一&#xff1a;最简单的考虑方式 二考虑某种使得参数beta降低的因素 三&#xff1a;增加人口自然出生率和死亡率&#xff0c;但不考虑疾病的死亡率 四&#xff1a;不考虑人口自然出生率和死亡率&#xff0c;只考虑疾病的死亡率 五&#xff1a;同时考虑人口自然出生率和死亡率和…

kali系统概述、nmap扫描应用、john破解密码、抓包概述、以太网帧结构、抓包应用、wireshark应用、nginx安全加固、Linux系统加固

目录 kali nmap扫描 使用john破解密码 抓包 封装与解封装 网络层数据包结构 TCP头部结构​编辑 UDP头部结构 实施抓包 安全加固 nginx安全 防止缓冲区溢出 Linux加固 kali 实际上它就是一个预安装了很多安全工具的Debian Linux [rootmyhost ~]# kali resetkali …

C#一维数组排序方法:选择排序法

目录 一、数组元素常见的排序法 1.选择排序法 二、实例1&#xff1a;选择排序法 1.源码 2.生成效果 一、数组元素常见的排序法 常见的排序法&#xff1a;选择排序法、冒泡排序法、快速排序法、直接插入法、希尔排序法、Array.Sort方法。 1.选择排序法 通过遍历实现排序&…

2024年华为OD机试真题-按身高和体重排队-Python-OD统一考试(C卷)

题目描述: :某学校举行运动会,学生们按编号(1、2、3…n)进行标识,现需要按照身高由低到高排列,对身高相同的人,按体重由轻到重排列;对于身高体重都相同的人,维持原有的编号顺序关系。请输出排列后的学生编号。 输入描述:两个序列,每个序列由n个正整数组成(0 < n …

λ-矩阵的多项式展开

原文链接 定义. 对于 m n m \times n mn 的 λ \lambda λ-矩阵 A ( λ ) [ a 11 ( λ ) . . . a 1 n ( λ ) ⋮ ⋮ a m 1 ( λ ) . . . a m n ( λ ) ] \mathbf{A}(\lambda)\begin{bmatrix} a_{11}(\lambda) & ... & a_{1n}(\lambda)\\ \vdots & & \vdo…