【Java】六大设计原则和23种设计模式

news2024/11/17 7:26:08

目录

一、JAVA六大设计原则

 二、JAVA23种设计模式

1. 创建型模式

2. 结构型模式

3. 行为型模式 

三、设计原则与设计模式

1. 设计原则

2. 设计模式

四、单例模式

1. 饿汉式

2. 懒汉式

四、代理模式

1. 什么是代理模式

2. 为什么要用代理模式

3. 有哪几种代理模式

4. 静态代理

5. 动态代理(解决静态代理模式缺点)

五、静态工厂


一、JAVA六大设计原则

         JAVA设计模式提供六个基本原则,分别是:

 (1)开闭原则(OCP) - The Open-Closed Principle

 (2)单一职责原则(SRP) - Single Responsibility Principle

 (3)里氏替换原则(LSP) - Liskov Substitution Principle

 (4)依赖倒置原则(DIP) - Dependency Inversion Principle

 (5)接口隔离原则(ISP) - Interface Segregation Principle

 (6)迪米特法则(DP) - Demeter Principle

 二、JAVA23种设计模式

         Java中的23种设计模式可以分为三大类:创建型模式结构型模式行为型模式

1. 创建型模式

        创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、生成器模式、原型模式。

2. 结构型模式

        结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

3. 行为型模式 

        行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。    

三、设计原则与设计模式

1. 设计原则

        设计原则是为了更好的设计软件的高层指导方针。它不提供具体的实现方式也不会绑定任何一种编程语言。  

        最常用的原则是SOLID(SRP, OCP, LSP, ISP, DIP)原则

2. 设计模式

        设计模式对关于面向对象问题的具体解决方案.比如说,如果你想创建一个类而且它在任何时刻只会有一个对象,那么你就应该使用单例类模式。

        设计模式是经过大量检测的安全的做法。

四、单例模式

        java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例

1. 饿汉式

        饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。

        

2. 懒汉式

        懒汉式不会立即实例化对象,而是在需要的时候才进行实例化,即调用getInstance()方法时才会创建实例。

        懒汉式本身不是线程安全的,因为多个线程可能同时进入getInstance()方法并尝试实例化对象,这可能导致创建多个实例。为了解决这个问题,可以通过加锁机制来确保线程安全。

        

        

四、代理模式

        代理====>中介隔离方法增强(不改变原方法)

1. 什么是代理模式

        代理模式给某一个对象提供一个代理对象并由代理对象控制对原对象的引用

       通俗的来讲代理模式就是我们生活中常见的中介

       举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。

       我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了。

2. 为什么要用代理模式

        中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。

        开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。

3. 有哪几种代理模式

        我们有多种不同的方式来实现代理。如果按照代理创建的时期来进行分类的话可以分为两种:

      静态代理: 静态代理是由程序员创建或特定工具自动生成源代码,再对其编译。在程序员运行之前,代理类.class文件就已经被创建了。

      动态代理: 动态代理是在程序运行时通过反射机制动态创建的。

      动态代理分为:

                  基于接口的动态代理(jdk自带)

                  基于子类的动态代理(第三方cglib)

4. 静态代理

        优点
        (1)代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
        (2)代理对象可以扩展目标对象的功能;
        (3)代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度

        缺点
        (1)在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
        (2)增加了系统的复杂度;

        创建Woman(女子)接口:

        

        创建Woman实例(PanJinLian):

         

        创建中介代理WangPo(媒婆)牵线 :

         

        PanJinLian找中介WangPo牵线: 

         

5. 动态代理(解决静态代理模式缺点)

        (1)jdk自带

        

        

        

        参数解释:

        proxy: 指代我们所代理的那个真实对象。

        method: 指代的是我们所要调用真实对象的某个方法的Method对象。

        args: 指代的是调用真实对象某个方法时接受的参数。

        Proxy这个类的作用就是用来动态创建一个代理对象的类

        Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

        loader: 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载

        interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了。

        h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上。

(2)第三方cglib

        依赖:

        

        

        

五、静态工厂

        概念:静态工厂是一种特殊的工厂模式,其特点是利用一个类的静态方法来创建并返回该类或其子类的实例。这种方式允许开发者通过静态方法的调用来获取对象,而无需直接使用构造函数。

        应用场景:静态工厂方法常用于创建单例对象。通过私有化构造函数,仅通过静态工厂方法提供唯一的实例获取途径,可以实现对象的重复利用,避免不必要的对象创建开销。同时,静态工厂方法还可以用于根据不同条件创建不同类型的对象。例如,在解析配置文件或处理不同数据格式时,可以根据输入的类型动态地创建相应的处理对象。

        例如:面条工厂生产多种面。

        

        

        

        

        

        

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

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

相关文章

Chainlit集成LlamaIndex实现知识库高级检索(路由检索器)

检索原理 llamaindex 是一个用于构建和部署基于文档的问答系统的框架。其中&#xff0c;RouterRetriever 是一个特定的检索器组件&#xff0c;它设计用于根据输入查询选择最佳的检索策略。RouterRetriever 的主要功能是在多个不同的检索器之间进行路由&#xff0c;根据输入的特…

STM32单片机编程调试常见问题(一) HardFault_Handler故障分析与解决

文章目录 一.概要二.什么是Hard fault三.Hard fault 产生的原因分析四.制作一个Hard fault程序并定位出问题原因1.查看堆栈指针SP的地址以及内容2.找到Return address地址3.查看汇编界面4.输入Return address地址&#xff0c;查找到问题代码 小结 一.概要 在嵌入式开发中&…

AR传送门+特定区域显示内容+放大镜 效果着色器使用

AR传送门特定区域显示内容放大镜 效果 关键词&#xff1a;Portal Mask 1、教程链接&#xff1a; AR 传送门教程 Unity - Portal Mask Implementation - Part 4_哔哩哔哩_bilibili 应用案例效果&#xff1a; 2、案例下载地址&#xff1a;使用unity 2021.3.33f1 obi 工具…

三分钟让你掌握PDF转音频:PDF2Audio背后的秘密

你有没有过这样的经历?工作繁忙,眼睛被一份又一份的PDF文件轰炸,盯得头昏眼花,却还得继续阅读。如果我告诉你,有一个简单的工具,可以把那些厚厚的PDF文档变成语音,让你在通勤、做家务时“听”文件,而不是“看”文件,你会不会心动? 今天,我们就来聊聊一个叫做PDF…

**CentOS7安装redis**

CentOS7安装redis 首先解压压缩包 redis-7.0.0.tar.gz tar -xvf redis-7.0.0.tar.gz接着进入到redis中 cd redis-7.0.0.tar.gz执行make命令编译 make接着执行安装命令 make install之后编译安装完后 程序都会在/usr/local/bin目录下 这里需要将在redis目录中redis.conf配置…

交通 | ACM SIGSPATIAL 24 深度强化学习求解多周期设施选址问题

论文作者信息&#xff1a;Changhao Miao, Yuntian Zhang, Tongyu Wu, Fang Deng, and Chen Chen. 2024. Deep Reinforcement Learning for Multi-Period Facility Location: p k p_{k} pk​-median Dynamic Location Problem. In The 32nd ACM International Conference on Ad…

如何评估和观测 IoTDB 所需的网络带宽?

IoTDB 推荐网络配置监控网络 I/O 一网打尽&#xff01; 网络数据传输速度太慢&#xff1f;延迟太高&#xff1f; 网络的硬件配置如何确定&#xff1f; 网络流量过大导致拥塞&#xff1f; 在现代计算机系统和应用程序中&#xff0c;网络 I/O 性能是决定整体系统表现的关键因素之…

微服务 OpenFeign 解析部署使用全流程

目录 1、什么是OpenFeign 1、Feign是什么&#xff1f;&#xff1f;http请求 2、OpenFeign是什么 3、Feign和openFeign有什么区别 2、应用 1、 需要开启nacos 和redis 2、准备工作 【1.对springsession做改动】 【2.对springsession-1做改动】 3、实现http请求管理 4、…

借助spring的IOC能力消除条件判断

shigen坚持更新文章的博客写手&#xff0c;记录成长&#xff0c;分享认知&#xff0c;留住感动。个人IP&#xff1a;shigen 在前边讲到了如何借助HashMap、枚举类、switch-case消除条件判断&#xff0c;这里讲到我们最常见的用spring的IOC能力来消除代码中的逻辑判断。其实大部…

精准测试在基金团队应用实践

以下为作者观点&#xff1a; 一、引言 精准测试是一套计算机测试辅助分析系统&#xff0c;精准测试的核心组件包含&#xff0c;软件覆盖率分析、用例和代码的双向追踪、智能回归测试用例选取、缺陷定位、测试用例聚类分析、测试用例自动生成系统&#xff0c;这些功能完整的构…

3-2 AUTOSAR RTE对Runnable的作用

返回总目录->返回总目录<- 一、前言 通过RTE给runnable提供触发事件。 runnable是可以被触发的,但是需要通过RTE来实现这个触发和调用runnable通过RTE给runnable提供所需资源。 RTE将runnable需要的一些资源通过接口传输给它(Port的实现)将BSW和SWC做隔绝。 因此OS和r…

前端大模型入门:使用Transformers.js手搓纯网页版RAG(二)- qwen1.5-0.5B - 纯前端不调接口

书接上文&#xff0c;本文完了RAG的后半部分&#xff0c;在浏览器运行qwen1.5-0.5B实现了增强搜索全流程。但受限于浏览器和模型性能&#xff0c;仅适合于研究、离线和高隐私场景&#xff0c;但对前端小伙伴来说大模型也不是那么遥不可及了&#xff0c;附带全部代码&#xff0c…

干货 | 2024大模型十大趋势(免费下载)

导读&#xff1a;近日&#xff0c;在2024世界人工智能大会上&#xff0c;腾讯正式发布了《2024大模型十大趋势——走进“机器外脑”时代》报告。目前&#xff0c;这一报告正在AI产业界各大社群快速传播。报告中&#xff0c;腾讯研究院试图通过10个关键性的趋势&#xff0c;去理…

c++(AVL树及其实现)

一、AVL树的概念 AVL树是最先发明的自平衡⼆叉查找树&#xff0c;AVL是⼀颗空树&#xff0c;或者具备下列性质的⼆叉搜索树&#xff1a;它的 左右子树都是AV树&#xff0c;且左右子树的高度差的绝对值不超过1。AVL树是⼀颗高度平衡搜索⼆叉树&#xff0c; 通过控制高度差去控…

python开源代码自学问题解决(requests+openpyxl+pymysql)

目的 解决一下在一个开源代码中遇到的问题&#xff0c;作者已经学完了python的基础内容&#xff0c;因此找了一份开源的python代码进行学习&#xff0c;下面这份开源代码主要作用就是在拉勾网上获取与Python相关的职位信息&#xff0c;并将这些信息保存到本地的MySQL数据库中&…

【Linux】初始进程

目录 基本概念 PCB task_struct task_struct内容分类 组织进程 查看进程 查看正在运行的进程信息 获取pid和ppid 创建子进程 基本概念 一个已经加载到内存中的程序&#xff0c;叫做进程&#xff0c;正在运行的程序&#xff0c;叫做进程&#xff0c;进程是担当分配系统…

如果你不愿意冒一切风险,就不要成为创业者:如何建立一个年收入 1800 万美元的支付业务

作者&#xff1a;Austin Mac Nab&#xff0c;VizyPay 的 CEO 兼创始人 在创业初期&#xff0c;如果有人告诉我&#xff0c;我需要冒一切风险才能成功&#xff0c;我大概会吓得绕道而行。但事实是&#xff0c;如果你不愿意冒一切风险&#xff0c;就不要成为创业者。本着这个信念…

「JavaScript深入」彻底搞懂JS原型与原型链

JavaScript深入 — 原型与原型链 一、原因二、使用class实现继承普通的类实现继承 三、原型四、原型链小结原型原型链prototype和proto 引申 一、原因 JavaScript中除了基础类型外的数据类型&#xff0c;都是对象&#xff08;引用类型&#xff09;。但是由于其没有类&#xff…

央行放大招!潘行长发话了,现在能“贷款炒股“,这是真的吗?

9月&#xff0c;央行掌门人潘行长最新放话了&#xff0c;二套房贷款利率也得下调。这降准的利好一出&#xff0c;股市小涨了一波后又回到了原位&#xff0c;给全球金融市场带来了一股不同寻常的暖流。而非常有意思的是&#xff0c;在这次众多的金融政策大礼包当中&#xff0c;有…

CentOS8.5.2111(3)实验之DHCP服务器架设

一、实验目标 1&#xff0e;掌握DHCP服务器的主配置文件各项申明参数及操作及其含义 2. 具备DHCP 服务器、中继服务器的配置能力 3. 具备测试客户端正常获取服务器分配地址的能力 4. 具备DHCP服务器故障排除能力 二、实训原理/流程 &#xff08;一&#xff09;项目背景 …