java中常用的设计模式_Java设计模式中的几种常用设计模式总结

2023-11-10

一、设计模式概念

1、定义

​Java包含23种设计模式,是一套对代码设计经验的总结,被人们反复利用,多人熟知的代码设计方式。

2、目的

​为了提高代码的可读性,可扩展性以及代码的复用性,为了解决在写代码过程中遇到的代码设计问题。

3、设计模式的六大原则

​3.1开闭原则

​对扩展开放,对修改关闭(尽可能对代码少修改)

​3.2里氏替换原则

​它是面向对象基本原则之一,任何父类(基类)出现的地方,子类都可以出现,也就是子类可以替换父类的任何功能(体现了父类的可扩展性)

3.3依赖倒转原则

​尽可能面向接口编程,依赖接口而不依赖类

3.4接口隔离原则

​一个类如果能实现多个接口,尽可能实现多个,为了降低依赖,降低耦合

3.5最少知道原则

​一个实体尽可能少的与其他实体产生相互关联关系,将实体的功能独立

3.6合成复用原则

​尽量使用合成,聚合的方式,而不使用继承

4、设计模式的分类

Java设计模式分为三大类

创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。

结构型模式:把类或对象结合在一起形成一个更大的结构。

行为型模式:类和对象如何交互,及划分责任和算法。

如下图所示:

b862517671bccf18fae4b2c62423df72.png

二、常用的几种设计模式

1、单例模式

单例模式是创建对象的一种特殊方式,程序从始至终都只创建一个对象叫单例(单实例)

分为两类

1.1、懒汉式单例

public class Person{

//为了不让其他类直接访问该成员懒汉式单例,在使用时创建对象

//1、私有静态变量

private static Person person=null;

//2、将构造器私有化

private Person(){

}

//3、提供一个静态方法,并返回该类的对象

public static Person getInstance(){

if(person==null){

//第一次访问

person=new Person();;

}

return person;

}

public void sayHello(){

System.out.println("sayHello方法");

}

}

1.2、饿汉式单例

public class Student {

//1、 饿汉式单例模式, 在类加载时创建一个对象

private static Student student = new Student();

// 2 构造器私有化

private Student(){

}

// 3 提供返回类对象的静态方法

public static Student getInstance(){

if(student !=null){

return student;

}

return null;

}

}

2、工厂方法模式

创建对象的过程不再由当前类实例化,而是由工厂类完成,在工厂类中只需要告知对象类型即可。工厂模式中必须依赖接口

2.1简单工厂模式

​简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。不修改代码的话,是无法扩展的。

d8ba9b41a85cddb40a6ee494f3a0e444.png

​以生产“电脑”为例,电脑有办公的功能,可以生产一体机或笔记本

代码与静态工厂一样

2.2静态工厂模式

fbadeec6fdaa43fdacbf06066efc4481.png

//电脑接口

public interface Computer {

//电脑办公

public void work();

}

//笔记本

public class PersonComputer implements Computer{

@Override

public void work() {

System.out.println("这是笔记本电脑,正在办公");

}

}

//一体机

public class WorkComputer implements Computer{

@Override

public void work() {

System.out.println("这是一体机正在办公");

}

}

//用于生产电脑的工厂 (这个工厂既可以生产台式机也可以生产笔记本)

public class ComputerFactory {

/**

* 根据不同的类型 生产不同的产品

* @param type

* @return

*/

public Computer produce(String type){

Computer computer =null;

if(type.equals("personComputer")){

computer = new PersonComputer();

}else if(type.equals("workComputer")){

computer = new WorkComputer();

}else{

System.out.println("不能生产");

}

return computer;

}

//静态工厂方法模式

public class ComputerFactory2 {

/**

* 静态工厂方法

* @param type

* @return

*/

public static Computer produce(String type){

// 定义一个接口的引用 通过接口new 一个实现类的对象

// 提高扩展性

Computer computer=null;

if(type.equals("workComputer")){

computer = new WorkComputer();

}else if(type.equals("personComputer")){

computer = new PersonComputer();

}else{

System.out.println("不能创建对象");

}

return computer;

}

}

//测试类

public class Test1 {

public static void main(String[] args) {

// 通过工厂类创建对象

ComputerFactory factory = new ComputerFactory();

// 要对象 找工厂

Computer computer1 = factory.produce("workComputer");

computer1.work();

// 创建笔记本

Computer computer2 = factory.produce("personComputer");

computer2.work();

Computer computer3 = ComputerFactory2.produce("workComputer");

computer3.work();

}

}

3.3工厂方法模式

​工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品。

a8509876326cfafa853802d3e0bf85fb.png

例如:

a99dfa477c6e7543e12ccdec1e47d2c1.png

//汽车接口

public interface Car {

public void showInfo();

}

public class AudiCar implements Car {

@Override

public void showInfo() {

System.out.println("这是一台奥迪汽车。。");

}

}

public class BMWCar implements Car {

@Override

public void showInfo() {

System.out.println("这是一台宝马汽车。");

}

}

/**

生产汽车的工厂接口

**/

public interface CarFactory {

public Car produce();

}

public class AudiCarFactory implements CarFactory {

@Override

public Car produce() {

return new AudiCar();// 这里AudiCar是Car的实现类

}

}

public class BMWCarFactory implements CarFactory {

@Override

public Car produce() {

return new BMWCar();// 因为BWMCar是Car的实现类

}

}

public class Test1 {

public static void main(String[] args) {

//先创建 汽车工厂

CarFactory bmwFactory = new BMWCarFactory();

// 这个工厂生产的汽车就是 宝马

Car bmw = bmwFactory.produce();

bmw.showInfo();

//这个模式对于同一级别的产品,可扩展性高

//可以扩展不同品牌的汽车,此时不需要修改代码,只需要增加代码即可

// 创建一个新的品牌汽车 大众汽车

CarFactory dazhongFactory = new DazhongCarFactory();

Car car = dazhongFactory.produce();

car.showInfo();

}

}

3、抽象工厂模式

​对于在工厂方法的基础上,对同一个品牌的产品有不同的分类,并对分类产品创建的过程 ,一个汽车产品 会分为不同的种类(迷你汽车 ,SUV汽车 )

a39b2aeb7615e973759c6a9e09dde134.png

/**

* 迷你汽车接口

*/

public interface MiniCar {

public void showInfo();

}

/**

* SUV汽车接口

*/

public interface SUVCar {

public void showInfo();

}

public class AudiMiniCar implements MiniCar {

@Override

public void showInfo() {

System.out.println("这是奥迪迷你汽车 ");

}

}

public class BMWMiniCar implements MiniCar {

@Override

public void showInfo() {

System.out.println("这是宝马Cooper迷你汽车");

}

}

public class AudiSUVCar implements SUVCar {

@Override

public void showInfo() {

System.out.println("这是一辆 奥迪SUV汽车");

}

}

public class BMWSUVCar implements SUVCar {

@Override

public void showInfo() {

System.out.println("这宝马的SUV系列");

}

}

public interface CarFactory {

//生成不同型号的汽车 ,两条产品线

public MiniCar produceMiniCar();

public SUVCar produceSUVCar();

}

public class AudiCarFactory implements CarFactory {

@Override

public MiniCar produceMiniCar() {

return new AudiMiniCar();

}

@Override

public SUVCar produceSUVCar() {

return new AudiSUVCar();

}

}

public class BMWCarFactory implements CarFactory {

// 生成迷你汽车的方法,返回MiniCar

@Override

public MiniCar produceMiniCar() {

return new BMWMiniCar();

}

//生成SUV汽车的方法, 返回SUVCar

@Override

public SUVCar produceSUVCar() {

return new BMWSUVCar();

}

}

/**

* 测试类

*/

public class Test1 {

public static void main(String[] args) {

//创建宝马迷你汽车 找工厂

CarFactory factory = new BMWCarFactory();

MiniCar car = factory.produceMiniCar();

car.showInfo();

}

}

总结:对于简单工厂,工厂方法模式和抽象工厂的区别和用途

小结:

★工厂模式中,重要的是工厂类,而不是产品类。产品类可以是多种形式,多层继承或者是单个类都是可以的。但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。

★使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。

★工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。

区别:

1、对于简单工厂,用于生产同一结构中的任意产品,对于新增产品不适用。

2、对于工厂方法,在简单工厂的基础上,生产同一等级结构中笃定产品,可以支持新增产品。

3、抽象工厂,用于生产不同种类(品牌)的相同类型(迷你,SUV),对于新增品牌可以,不支持新增类型

8、模板方法

定义:

​模板方法是一种行为模式,父类的一个方法定义完成这个方法的步骤,但不具体实现具体细节,由子类完成各个步骤的实现,在创建子类对象时,最终实现过程是子类的方法。

模板方法的准备:

​1、继承关系

​2、父类是抽象类:抽象类实现了模板方法,定义了算法的估计

​3、子类继承抽象类:实现抽象方法,完成完整的算法

public abstract class AbstractPerson {

/**

* 定义一个模板方法,用于实现这个方法的基本“骨架”

* 每一步骤的具体实现由子类完成

*/

public void preparedSchool(){

getUp();

dressing();

eat();

}

//起床

public abstract void getUp();

//穿衣服

public abstract void dressing();

//吃早餐

public abstract void eat();

}

public class Student extends AbstractPerson {

@Override

public void getUp() {

System.out.println("学生起床,起不来,闹钟响3次");

}

@Override

public void dressing() {

System.out.println("学生穿衣服,找不到衣服");

}

@Override

public void eat() {

System.out.println("学生吃早餐,来不及吃早餐");

}

}

public class Teacher extends AbstractPerson {

@Override

public void getUp() {

System.out.println("老师起床,7点半起床");

}

@Override

public void dressing() {

System.out.println("老师要衣服得体,穿工装");

}

@Override

public void eat() {

System.out.println("老师吃早餐。");

}

}

public class Test1 {

public static void main(String[] args) {

Student stu = new Student();

stu.preparedSchool();

Teacher teacher = new Teacher();

teacher.preparedSchool();

}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中常用的设计模式_Java设计模式中的几种常用设计模式总结 的相关文章

  • 考研复试数据库原理课后习题(十四)——内存数据库系统

    内存数据库系统 1 内存数据库和磁盘数据库有什么区别 2 内存数据库的特点有哪些 内存是计算机存储体系结构中能够被程序可控访问 相对于硬件控制的cache 的最高层次 是能够提供大量数据存储的最快的存储层 内存数据库具有几个重要特性 高吞吐
  • 【RT-DETR】《DETRs Beat YOLOs on Real-time Object Detection》译读笔记

    DETRs Beat YOLOs on Real time Object Detection 摘要 近期 基于端到端的 transformer based的检测器 DETRs 取得了卓越的性能 然而 DETRs类模型计算成本高的问题尚未得到
  • 前沿应用丨大规模无人机集群与“虚实结合”半实物仿真系统

    一 应用背景 无人机集群在军事 安全 救援 航空监测 物流配送等领域具有广泛的应用前景 它可以提高任务执行的效率 灵活性和安全性 同时降低人力资源的需求和风险 无人机集群研究涉及多个学科领域 如机器人学 控制理论 通信技术和人工智能等 目前
  • TCP/IP 网络设备与基础概念

    本文目的在于按照自己的理解 解释清楚网络中的一些基本概念 以及支撑概念落地的网络设备的工作原理 从而解决网络联通性问题 以及为定量分析网络性能问题打基础 如有错漏 欢迎指正 什么是 WAN vs LAN 什么是子网 网关 LAN vs 子网
  • 小白笔记——HTML到Java的Date型转换

    本笔记旨在记录新手学习编程时遇到的问题以及解决方法 主要是作为备忘录来使用 希望路过的大神可以指点一二 同时也希望这个笔记可以帮助到其他有同样困惑的小伙伴 大学毕业之后就再没有用中文写过文章了 所以我写的东西字里行间都会透露出一股子翻译大碴
  • 星星之火-58:CPRI协议缺点,eCPRI协议是如何克服CPRI协议的不足?

    1 CPRI协议不足 CPRI数据传输链路属于空口协议栈 硬件 应用软件共同实现空口协议栈 RFIC gt FPGA RF gt 时域采样 CPRI gt CPRI gt DSP gt L1 软件 gt L2软件 gt L3软件 1 CPR
  • Orcale产生随机数

    1 Oracle中产生uuid的方法 select lower sys guid from dual 2 oracle中函数nvl 如果oracle第一个参数为空那么显示第二个参数的值 如果第一个参数的值不为空 则显示第一个参数本来的值
  • [orin] nvidia orin 上配置tensorrt

    版本 jetpack 5 0 1 tensorrt 8 4 1 5 概述 tensorrt会跟着jetpack的包一起安装 系统本身自带的python是3 8的版本 tensorrt的python包位于这个路径下 cd usr lib py
  • 可视化dockerregistry中的镜像

    1 先来个简单的 docker run d p 5000 5000 name registry srv registry 2 docker run it p 8080 8080 name registry web link registry
  • WebSocket的核心事件

    前言 在上一篇文章中 Spring Boot使用WebSocket模拟聊天 已经简单实现了我们WebSocket的Demo 里面使用的WebSocket事件函数在此做一个总结 WebSocket整体通讯的流程就是 建立链接 gt 发送消息
  • 用定时器0控制切换流水灯顺序,用外部中断控制两种数码管显示方式

    include reg52 h 此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16 对数据类型进行声明定义 typedef unsigned char u8 sbit LSA P2 2 sbit LS
  • 开关电源变换器稳态原理分析(电感伏秒平衡及电容电荷平衡)

    在大量开关周期中 当开关频率固定时 开关占空比D也保持恒定 例如对n个周期 电流波形和电压波形在每个开关周期是重复的 这就意味着电压波形和电流波形变成周期性波形 周期为T 即i n 1 T i nT v n 1 T v nT 这样的状态就称
  • 通过 Debian Packages安装ROS 2(Linux Mint20.2安装ROS2 foxy)

    安装ROS foxy的文章较少 这里记录一下自己安装时遇到的一些坑 1 https raw githubusercontent com访问不了 1 设置语言环境 locale check for UTF 8 sudo apt update
  • openssh升级编译安装,更新Openssh和openssl

    openssh下载 https www openssh com openssl下载 https www openssl org 注 openssh需要配套openssl使用 软件包安装和编译安装的区别 软件包安装 yum provides
  • pycharm中从虚拟环境导包

    一 现有环境 在terminal中输入命令 pip freeze gt requirements txt 下载包到本地 二 把下载好的包放入新环境项目的跟目录下 新环境会提示是否安装 点击 install requirements 点击in
  • LeetCode 18. 四数之和

    文章目录 1 排序 双指针 2 对上面代码加剪枝 题目链接 https leetcode cn problems 4sum 1 排序 双指针 class Solution using ll long long public vector
  • Linux使用4g模块拨号上网

    imux6ull 串口连接移远的4g模块EC200N 使用pppd拨号上网 1 设置内核支持pppd 打开pppd下的所有项 编译内核 Device Drivers gt Network device support gt PPP poin
  • Git出现无法同步问题的解决方式

    在我们使用git同步至github服务器上去时 可能会出现 the request URL returns error 403 Forbbidden while accessing 权限不够 此项目为私有 没有权限 输入用户名和密码 或远程
  • 高级面向对象技术

    封装 三种方式 工厂函数模式 构造函数模式 构造函数模式和原型结合 工厂函数模式代码示例 function factory name var obj new Object obj name name obj sayName function

随机推荐

  • 9_1 ArrayList 初始化 (elementData.getClass() != Object[].class)

    第一个知识点 数组也有自己 class 表示维度 Lxxx表示数组的元素类型 package 集合类 ArrayList类 import java util ArrayList import java util Arrays public
  • 实现高效的并行计算:使用Fork/Join框架和并行流

    要实现高效的并行计算 可以使用Java中的Fork Join框架和并行流 这两个工具都是Java提供的用于并行处理任务的机制 可以充分利用多核处理器的能力 1 Fork Join框架 Fork Join框架是Java中用于并行任务处理的一个
  • 有向图邻接矩阵c语言编程,邻接矩阵有向图(一)之 C语言详解

    本章介绍邻接矩阵有向图 在 图的理论基础 中已经对图进行了理论介绍 这里就不再对图的概念进行重复说明了 和以往一样 本文会先给出C语言的实现 后续再分别给出C 和Java版本的实现 实现的语言虽不同 但是原理如出一辙 选择其中之一进行了解即
  • vue-i18n 的使用

    一 安装 安装 Vue i18n 插件 您可以使用以下命令进行安装 npm install vue i18n next save 安装 npm install vue i18n next save legacy peer deps adde
  • 微软Kinect:谁还要控制器?

    体感控制游戏 Kinect谁还要控制器 这是XBoxKinect系统背后最重要的思想 微软的新玩具在10天内卖出了100万台 记者陈赛简单说 Kinect是嵌入XBox的三个小镜头 一个RGB摄像头 一个红外投影仪和一个远程感应器 这些镜头
  • 火狐浏览器插件

    All in one sidebar 侧栏控制 Firebug 在浏览网页的同时 具备丰富开发的功能 LastPass 在线密码管理器 gtranslator 翻译 Xmarks 书签 ColorZilla 颜色复制 Adblock Plu
  • 北京大学肖臻老师《区块链技术与应用》公开课笔记20——ETH中GHOST协议篇

    北京大学肖臻老师 区块链技术与应用 公开课笔记 以太坊GHOST协议 对应肖老师视频 click here 全系列笔记请见 click here About Me 点击进入我的Personal Page BTC系统中出块时间为10min 而
  • AntdPro项目前端测试的探索

    测试规范 测试工具的选择 在本项目中以 ant design pro 项目为测试项目 测试工具最终选型为 jest javascript的常用测试框架 enzyme 支持react的jest测试库 react test renderer 快
  • ftp服务器收集信息,用VBScript收集系统信息并上传到ftp空间

    之前无聊整理出来了一份这个东西 因为在单位给新入职的员工配电脑时 需要登记一遍设备 可每次总要查感觉挺麻烦 结果下面的这份VBS脚本就诞生了 只可惜这个脚本做好了却没派上用场哎 这个脚本的功能是运行后自动将查询到的计算机相关信息记录到一个文
  • 详解 Neo4J 出现问题

    项目启动报错提示如下错误 org springframework data mapping PropertyReferenceException No property selectMenuPage found for type Menu
  • 传输层--UDP协议

    传输层的功能 传输层一个很重要的功能就是复用和分用 应用层不同进程的报文通过不同端口向下交到传输层 再往下就共用网络层提供的服务 具体功能 1 传输层是为应用进程之间提供端到端的逻辑通信 网络层是为主机之间提供逻辑通信 2 传输层要对收到的
  • 使用mysql

    使用mysql 语句来解决复杂逻辑问题 select id SUBSTRING INDEX name 1 from test where parent SUBSTRING INDEX使用方法 name字段 是标识符 1代表是第一个出现的 U
  • Python pyi文件

    当用nn conv2d 函数的时候 发现它内部其实是调用的F conv2d 而F conv2d 的定义是在 init pyi文件里 那么 pyi到底是什么文件呢 pyi文件是Python 的存根文件 用于代码检查时的类型提示 pyi文件是P
  • linux下执行shell脚本调用sql文件,传输到远程服务器

    1 编写sql 2 编写shell shell里用sqlplus调用sql文件生成csv文件 还要编写对端服务器的相关信息 3 将写好的sql和shell文件传输到linux服务器上 4 切换到文件存放目录下 使用以下命令执行shell s
  • Elasticsearch删除文档

    根据id删除 例如删除id为110的文档 DELETE ffbf doc 110 返回信息 index ffbf type doc id 110 version
  • 网络地址转换NAT原理及应用

    这是做路由器的时候 学习网络地址转换Network Address Translation后的一些理解整理 主要通过实例和图表的方式展示了NAT的工作原理和每个阶段的状态 本文的NAT是基本于Linux下的iptables命令实现 1 概述
  • 色字当头一把刀,看我如何用Python针对裸聊渗透测试

    本篇文章由知柯 信息安全 CSDN博主鸿渐之翼联合发布 转载请标明出处 深圳市狩猎者网络安全技术有限公司旗下安全团队 CSDN 知柯信息安全 知柯信息安全 用心呵护您的安全 Professional in Software Security
  • 前端vue显示柱状图_详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)_旧址_前端开发者...

    数据可视化 将数据通过图表的形式展现出来将大大的提升可读性和阅读效率 本例包含柱状图 折线图 散点图 热力图 复杂柱状图 预览面板等 技术栈 vue2 x vuex 存储公共变量 如色值等 element ui 饿了么基于vue2开发组件库
  • Manning in Action系列图书体例分析

    Manning in Action系列图书体例分析
  • java中常用的设计模式_Java设计模式中的几种常用设计模式总结

    一 设计模式概念 1 定义 Java包含23种设计模式 是一套对代码设计经验的总结 被人们反复利用 多人熟知的代码设计方式 2 目的 为了提高代码的可读性 可扩展性以及代码的复用性 为了解决在写代码过程中遇到的代码设计问题 3 设计模式的六