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

目录

一、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.mzph.cn/web/54458.shtml

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

相关文章

服务器几核几G几M是什么意思?如何选择?

服务器几核几G几M是什么意思&#xff1f;我们建站、搭建网络平台都要用到云服务器&#xff0c;不管在腾讯云、阿里云还是别的云服务平台选购&#xff0c;都会接触到服务器配置。云服务器就是把物理服务器&#xff08;俗称“母鸡”&#xff09;&#xff0c;用虚拟机技术虚拟出多…

Android SystemUI组件(09)唤醒亮屏 锁屏处理流程

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注左侧上方锁屏分析部分 唤醒亮屏 即可。 Power按键的处理逻辑最终是由PhoneWindowManager来…

数据可视化基础:让数据说话

一、引言 在信息洪流中&#xff0c;数据可视化如同灯塔&#xff0c;照亮了数据的海洋&#xff0c;让我们能够洞察数据背后的意 义。 下面是对数据可视化的详细介绍&#xff0c;包括定义、作用、类型、原则、工具方法以及应用场景&#xff0c; 并附上具体的代码示例。 二、数…

BUSHOUND的抓包使用详解

BUSHOUND是个过滤软件&#xff0c;确切来说是在windows操作系统它的驱动层USB传输的数据。所以这个数据上可能是与USB的总线上的数据是有一点差异的。 先要选择设备的抓包。所以就是在device这个界面底下&#xff0c;我们首先要选择我们要抓的设备。 尝试下键盘设备 电脑键盘…

mmdetection实战,训练自己的数据集

1 库安装 pip install timm1.0.7 thop efficientnet_pytorch0.7.1 einops grad-cam1.4.8 dill0.3.6 albumentations1.4.11 pytorch_wavelets1.3.0 tidecv PyWavelets -i https://pypi.tuna.tsinghua.edu.cn/simplepip install -U openmim -i https://pypi.tuna.tsinghua.edu.cn…

在Kali Linux中使用VNC和iptables配置xrdp以实现远程连接

在Kali Linux中&#xff0c;使用VNC和iptables配置xrdp以实现远程连接涉及几个步骤。不过&#xff0c;值得注意的是&#xff0c;VNC和xrdp是两种不同的远程桌面协议&#xff0c;它们通常不会在同一配置中同时使用&#xff08;除非有特殊的网络架构需求&#xff09;。然而&#…

【Linux】用虚拟机配置Ubuntu 24.04.1 LTS环境

目录 1.虚拟机安装Ubuntu系统 2.Ubuntu系统的网络配置 3.特别声明 首先我们先要下载VMware软件&#xff0c;大家自己去下啊&#xff01; 1.虚拟机安装Ubuntu系统 我们进去之后点击创建新的虚拟机&#xff0c;然后选择自定义 接着点下一步 再点下一步 进入这个界面之后&…

基于Docker部署最新版本SkyWalking【10.1.0版本】

文章目录 前言前置条件一、创建Docker 网络二、部署 SkyWalking OAP 服务器三 部署 SkyWalking UI四 查看日志4.1. 查看 SkyWalking OAP 日志4.2. 查看 SkyWalking UI 日志 五 停止并删除容器结论 前言 由于本地的 JDK 版本与 SkyWalking 对应的 JDK 版本不一致&#xff0c;为…

C语言:预编译过程的剖析

目录 一.预定义符号和#define定义常量 二.#define定义宏 三.宏和函数的对比 四、#和##运算符 五、条件编译 在之前&#xff0c;我们已经介绍了.c文件在运行的过程图解&#xff0c;大的方面要经过两个方面。 一、翻译环境 1.预处理&#xff08;预编译&#xff09; 2.编译 3…

ChatGPT进行文本分类

1.建立客户端 from openai import OpenAI client = OpenAI(base_url="https://api.chatanywhere.tech/v1" )2.建立相关函数 def get_openai_response(client, system_prompt, user_prompt, model="gpt-3.5-turbo"):response

【网络安全】Cookie与ID未强绑定导致账户接管

未经许可,不得转载。 文章目录 前言正文前言 DigiLocker 是一项在线服务,旨在为公民提供一个安全的数字平台,用于存储和访问重要的文档,如 Aadhaar 卡、PAN 卡和成绩单等。DigiLocker 通过多因素身份验证(MFA)来保护用户账户安全,通常包括 6 位数的安全 PIN 和一次性密…

51c视觉~CV~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/11668984 一、 CV确定对象的方向 介绍如何使用OpenCV确定对象的方向(即旋转角度&#xff0c;以度为单位)。 先决条件 安装Python3.7或者更高版本。可以参考下文链接&#xff1a; https://automaticaddison.com/how-to-s…

Redis: 集群高可用之节点与插槽管理

概述 Redis Cluster 集群模式&#xff0c;它使用的是分片来存储数据的&#xff0c;数据都存在多个节点上。而且使用了哈希槽这样的机制&#xff0c;它内部维护了 16384 个插槽那就是说每一个节点其实都具体的分布了一些槽&#xff0c;如果我们添加一个节点的话&#xff0c;槽总…

Redis --- 第二讲 --- 特性和安装

一、背景知识 Redis特性&#xff1a; Redis是一个在内存中存储数据的中间件&#xff0c;用于作为数据库&#xff0c;作为缓存&#xff0c;在分布式系统中能够大展拳脚。Redis的一些特性造就了现在的Redis。 在内存中存储数据&#xff0c;通过一系列的数据结构。MySQL主要是通…

docker学习笔记(1.0)

docker命令 下载镜像相关命令 检索&#xff1a;docker search 比如&#xff1a;docker search nginx 是查看有没有nginx镜像 后面的OK表示是不是官方镜像&#xff0c;如果有就是官方镜像&#xff0c;如果没有就是第三方的。 下载&#xff1a;docker pull 比如&#xff1a…

Redis篇(Redis原理 - 数据结构)(持续更新迭代)

目录 一、动态字符串 二、intset 三、Dict 1. 简介 2. Dict的扩容 3. Dict的rehash 4. 知识小结 四、ZipList 1. 简介 2. ZipListEntry 3. Encoding编码 五、ZipList的连锁更新问题 六、QuickList 七、SkipList 八、RedisObject 1. 什么是 redisObject 2. Redi…

go+redis基于tcp实现聊天室

goredis实现聊天室 基于tcp连接通过redis实现了消息的广播&#xff0c;命令改名&#xff0c;查询在线人数&#xff0c;查询用户活跃度 serverclinet server 聊天室服务端的流程可以分为几个主要部分&#xff1a;初始化、监听连接、处理每个连接以及消息的处理和转发 1. 初…

【优选算法】(第八篇)

目录 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 最⼩覆盖⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#…

Redis:list类型

Redis&#xff1a;list类型 list命令非阻塞LPUSHLRANGELPUSHXRPUSHRPUSHXLPOPRPOPLINDEXLINSERTLLENLREMLTRIMLSET 阻塞BLPOPBRPOP 内部编码ziplistlinkedlistquicklist 几乎每种语言都有顺序表、数组、链表这样的顺序结构&#xff0c;Redis也做出了相应的支持。 如图&#xff…

C++基础:enum class作用域枚举 (C++11)

C基础&#xff1a;enum class作用域枚举 介绍特点作用域强类型默认底层类型 介绍 enum class 是C11引入的一种改进的枚举机制&#xff0c;主要改进了传统的enum类型的作用域控制问题&#xff0c; 故也被称为作用域枚举&#xff08;scoped enumerations&#xff09;。那么&…