Java中常见的设计模式(持续更新中)

文章目录

  • 介绍
  • 模板设计模式
    • 介绍
    • 优势
    • 代码
  • 装饰者设计模式
    • 介绍
    • 套路
    • 代码
  • 单例设计模式
    • 介绍
    • 步骤
    • 分类
    • 代码
  • 多例设计模式
    • 介绍
    • 步骤
    • 代码
  • 工厂设计模式
    • 介绍
    • 步骤
    • 代码

介绍

是一套被反复使用,多数人知晓,经过分类编目的,代码设计经验的总结
使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性,程序的重用性
简单的说就是一套良好的编码风格,通过众多开发人员,长时间测试,经验总结而来,不同的设计模式也有不同的好处

模板设计模式

介绍

把抽象类整体就可以看做成一个模板,模板中不能决定的东西定义为抽象方法,让使用模板的类(继承抽象类的类)去重写抽象方法实现需求。

优势

模板已经定义了通用结构,使用者只需要关心自己需要实现的功能即可

代码

public abstract class Demo {public void writeZuoWen(){head();middle();end();}private void head(){System.out.println("作文的开头");}private void end(){System.out.println("作文的结尾");}public abstract void middle();
}

装饰者设计模式

介绍

不改变原类,在不继承的基础上,动态的扩展一个对象的功能(功能增强)

套路

  1. 装饰类和被装饰类需要共同的父类型
  2. 装饰类的构造要接收被装饰类的对象
  3. 在装饰类中把要增强扩展的功能进行扩展
  4. 对于不要增强的功能直接引用

代码

//介绍BufferReader  提高读的效率//场景:在使用FileReader类时,发现读的效率低,希望提高效率
//不能修改FileReader类,不能继承FileReader类,要对read(char[] cbuf)方法进行增强//使用装饰者设计模式
//装饰类:BufferReader  被装饰类:FileReader
//他俩都由共同的父类Reader
public class BufferedReader extends Reader(){private FileReader fileReader;public BufferedReader(FileReader fileReader){this.fileReader = fileReader;
}//成员变量
private int size = 1024*8;//缓冲区对象
char[] cbuf = new char[size];//重写read()方法
public int read(){read(cbuf);
}//重写read(char[] cbuf){
public int read(char[] cbuf){...
}//重写相关方法
public void close(){fileReader.close();//调用原有功能
}}

单例设计模式

介绍

正常情况下一个类就可以创建多个对象,但是有时候一个对象就能搞定的事情,创建多个对象就会浪费内存
通过单例模式创建的项目的类,这个类只能有一个对象,可以节省内存,共享数据

步骤

  1. 将构造方法私有化,使其外部不能通过new关键字创建该类的对象
  2. 定义一个静态方法返回这个唯一对象
  3. 在该类内部创建一个唯一的实例化对象

分类

  1. 饿汉式(使用类的时候已经将对象创建完毕) 很着急的样子
  2. 懒汉式(在调用该静态方法的时候才会创建对象) 不着急

代码

public class King1 {private static King1 king1 = new King1();private King1(){}public static King1 getInstance(){return king1;}}
public class King2 {private static King2 king2;private King2(){}public synchronized static King2 getInstance(){if (king2 == null){king2 = new King2();}return king2;}}

多例设计模式

介绍

通过多例模式可以保证该类有固定数量的实例
应用:线程池

步骤

  1. 创建一个类,将其构造方法实例化,使其不能在类的外部通过new创建对象
  2. 在类中定义该类被创建对象的总数量
  3. 在类中定义存放类实例的list集合
  4. 在类中提供静态代码块,在静态代码块中创建类的实例
  5. 提供静态方法让外部获取实例

代码

public class Teacher {private Teacher(){}private static int size = 3;private static List<Teacher> teachers = new ArrayList<>();static {for (int i = 0; i < size; i++) {teachers.add(new Teacher());}}public static Teacher getInstance(){return teachers.get(new Random().nextInt(teachers.size()));}//要想像线程池那样public static Teacher getInstance(int size){int count = teachers.size();int result = size - count;if (result > 0){for (int i = 0; i < result; i++) {teachers.add(new Teacher());}}return  getInstance();}}

工厂设计模式

介绍

是Java中最常用的设计模式之一,属于创建型模式,它提供了一种创建对象的最佳方式。
作用:类与类之间进行解耦

步骤

  1. 编写一个接口,定义一个方法
  2. 编写子类1实现接口,重写其方法
  3. 编写子类2实现接口,重写其方法
  4. 编写一个接口工厂类
    1. 类中私有化构造方法
    2. 定义静态方法来让外部创建对象

代码

public interface Car {void run();
}
public class Falali implements Car{@Overridepublic void run() {System.out.println("法拉利破百仅需3秒");}
}
public class Audi implements Car{@Overridepublic void run() {System.out.println("奥迪RS7破败仅需3.8秒");}
}
public class CarFactory {private CarFactory() {}public static Car getInstance(String name) {Car car = null;if ("Falali".equals(name)){car = new Falali();}else if ("Audi".equals(name)){car = new Audi();}return car;}
}

后续测试中name可以在.properties配置文件中读取来进行获取,这样就可以更改配置文件来更改对象,实现解耦

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

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

相关文章

express操作mysql数据库的方法总结

作为前端&#xff0c;我们无需去考虑数据库的问题&#xff0c;业务场景需要的话&#xff0c;我们可以mock数据&#xff0c;满足暂时的联调场景。但是对于数据库&#xff0c;我们前端可以不用&#xff0c;却不能不了解不懂。所以这篇文章整理下&#xff0c;nodejs框架express中怎…

007 spring aop(通知)(xml)

文章目录 pom.xmlLogAspect.javaStudentServiceImpl.javaStudentService.javaapplicationContext.xmlStudentServiceImplTest.java pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…

IDEA+Docker远程一键部署SpringBoot项目

一.引语 本文将学习使用IDEADocker远程一键部署SpringBoot项目&#xff0c;对比上传jar包到服务器&#xff0c;再通过java指令运行项目&#xff0c;极大程度的提高了项目部署效率。可谓不用不知道&#xff0c;一用再也停不下来~ 为了后续学习方便&#xff0c;需要提前进行如下…

Firebase集成

目标&#xff1a; 1&#xff09;集成Firebase; 2) 集成Firebase Crashlytics&#xff0c;监控APP崩溃 海外APP开发需要科学上网。 一、Firebase是什么&#xff1f; Firebase 是一个应用开发平台&#xff0c;可帮助您构建和拓展用户喜爱的应用和游戏。提供了应用的构建、发布…

Nuxt3 实战 (三):使用 release-it 自动管理版本号和生成 CHANGELOG

release-it 能做什么&#xff1f; 增加版本号并提交 Git生成变更日志&#xff08;Changelog&#xff09;并提交到 Git创建 Git 标签并推送到远程仓库发布到 npm 等软件仓库在 GitHub、GitLab 等平台创建发行版 前置知识 在看这篇文章之前&#xff0c;我们有必要了解一下 Sem…

css不知道宽度,如何绘制一个正方形

我们可以给当前盒子加一个伪元素&#xff0c;设置padding-bottom: 100%&#xff0c;就可以绘制一个正方形 <div class"parent"><div></div><div></div><div></div> </div> .parent{width:100%;padding:20px;displ…

Few-Shot目标检测数据集 | Few-Shot目标检测数据集_已经整理成MS-COCO数据格式_含60000+张图_可直接用于目标检测算法训练

项目应用场景 面向 Few-Shot 目标检测场景&#xff0c;项目提供 6000 张图&#xff0c;已经整理成 MS-COCO 数据格式&#xff0c;可用于 Few-Shot 目标检测的训练数据集&#xff0c;或作为 Few-Shot 目标检测数据集的补充。 数据集展示 数据集下载 > 具体参见项目 README.m…

人工智能_大模型023_AssistantsAPI_01_OpenAI助手的创建_API的调用_生命周期管理_对话服务创建---人工智能工作笔记0159

先来说一下一些问题: 尽量不要微调,很麻烦,而且效果需要自己不断的去测试. 如果文档中有图表,大量的图片去分析就不合适了. 是否用RAG搜索,这个可以这样来弄,首先去es库去搜能直接找到答案可以就不用去RAG检索了,也可以设置一个分,如果低于60分,那么就可以去进行RAG检索 微…

Teachable Machine模型之TensorFlow使用篇

前言: 使用在teachable machine训练的h5格式模型 tensorflow使用篇 1. 使用teachable machine训练模型 地址: 传送门, 需要梯子翻一下 训练后, 导出的时候可以选择三种类型 导出模型文件 converted_keras.zip (py版) 解压后得到 2. py项目中使用模型 根据你当时使用tea…

7.网络编程-安全

目录 引言 Session Cookie JWT (JSON Web Token) 网络攻击 CSRF DDoS 其他常见网络攻击类型及应对措施 引言 Session、Cookie 和 JWT 都是Web开发中用于实现用户状态管理和身份验证的技术。它们各自有不同的特点和应用场景&#xff1a; Session Session 是一种服务器…

基于erp业务的责任链模式实战

Handler接口是用来规范所有的责任链节点都要实现 处理数据的方法 AbstractSchHandlerContains 是责任链节点保存的抽象类 ScheduleHandlerContains 子类可以覆盖责任链节点保存容器实现自定义遍历责任链节点容器方法设置自定义容器 一. 创建责任链节点接口 用于规范责任链的处理…

volta(轻松切换管理Node.js版本)

Node.js版本管理 Volta提供了一个简单直观的命令行界面&#xff0c;可以轻松地安装、卸载、更新和切换Node.js版本。 Volta 既可以全局使用&#xff0c;也可以在项目级别使用&#xff0c;可以为每个项目单独设置node版本&#xff0c;nvm不行。 下载安装Volta 参考&#xff1a; …

蓝桥杯-网络安全比赛(5)基础学习-JavaScript原型链的prototype、constructor、object.create()、__proto__

JavaScript的prototype、constructor、Object.create()和__proto__通常不直接作为解题的关键&#xff0c;但它们对于理解和分析Web应用的安全性至关重要。 网络安全比赛通常涉及Web应用的漏洞挖掘和攻击&#xff0c;这要求参赛者具备深厚的Web开发知识&#xff0c;包括JavaScri…

深度学习的层、算子和函数空间

目录 一、层、算子和函数空间概念 二、层&#xff08;Layers&#xff09; 三、算子&#xff08;Operators&#xff09; 3.1常见算子 3.2常见算子的性质 四、函数空间&#xff08;Function Space&#xff09; 一、层、算子和函数空间概念 层&#xff08;Layers&#xff09…

自建远程桌面服务器,控制免root安卓手机和pc

RustDesk是一个开源的远程桌面软件&#xff0c;它允许用户通过互联网在不同设备之间共享桌面和控制权限。这款软件以最少的配置提供了自托管和安全保障&#xff0c;是一个类似于TeamViewer的开源替代品​ (RustDesk)​。RustDesk支持在Windows、macOS、Linux、iOS、Android以及…

[数据概念]对原始公开数据赋权的思考

“ 对于原始、公开信息&#xff0c;要充分保障整个社会对该类信息资源的合理利用&#xff0c;以维护信息公平和促进更大范围的创新。。” 2022年12月&#xff0c;党中央、国务院发布《关于构建数据基础制度更好发挥数据要素作用的意见》&#xff08;以下称《数据二十条》&#…

Java8新特性--lambda表达式

lambda表达式本质上是一个匿名函数&#xff0c;在lambda表达式中我们只需要关心参数列表以及方法体。优点是可以减少代码量。 1.语法 基本语法&#xff1a;(参数)->表达式 或 (参数) -> {语句;} 2.函数式接口 要了解lambda表达式&#xff0c;首先要了解什么是函数式接口…

互联网大厂ssp面经之路:计算机网络part2

什么是 HTTP 和 HTTPS&#xff1f;它们之间有什么区别&#xff1f; a. HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;安全超文本传输协议&#xff09;是用于在Web上传输数据的协议。它们之间的区别在于安全性和数据传输方式。 b. HTTP是一种不安全的协议&…

[RK3588-Android12] 关于HDMIN-IN视频调试命令

问题描述 如题关于HDMIN-IN视频应该如何调试。 解决方案&#xff1a; 视频调试 HDMI-IN 设备在内核中会被注册为 video 设备&#xff0c;生成的节点如&#xff1a;/dev/video8。 可以通过 v4l2-ctl 命令来获取设备信息和抓帧。 1.获取设备信息&#xff1a; v4l2-ctl -d /dev…

变分自编码器生成新的手写数字图像

变分自编码器&#xff08;Variational Autoencoder&#xff0c;VAE&#xff09;是一种生成模型&#xff0c;通常用于学习数据的潜在表示&#xff0c;并用于生成新的数据样本。它由两部分组成&#xff1a;编码器和解码器。 编码器&#xff08;Encoder&#xff09;&#xff1a;接…