当前位置: 首页 > news >正文

【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.lryc.cn/news/454472.html

相关文章:

  • Java IO流全面教程
  • PCIe6.0 AIC金手指和板端CEM连接器信号完整性设计规范
  • 二、创建drf纯净项目
  • 算法1:双指针思想的运用(2)--C++
  • L1415 【哈工大_操作系统】CPU调度策略一个实际的schedule函数
  • 免费版U盘数据恢复软件大揭秘,拯救你的重要数据
  • Pikachu-Unsafe FileUpload-客户端check
  • 【数据结构】什么是红黑树(Red Black Tree)?
  • Xcode16适配
  • Vue - 路由用法
  • SpringBoot框架下校园资料库的构建与优化
  • vscode 连接云服务器(ubantu 20.04)
  • 【SpringBoot详细教程】-09-Redis详细教程以及SpringBoot整合Redis【持续更新】
  • 排序算法之——归并排序,计数排序
  • Linux中环境变量
  • 163页PPT罗兰贝格品牌战略升级:华为案例启示与电器集团转型之路
  • 系统设计,如何设计一个秒杀功能
  • Linux:进程入门(进程与程序的区别,进程的标识符,fork函数创建多进程)
  • 索尼MDR-M1:超宽频的音频盛宴,打造沉浸式音乐体验
  • 【Linux】线程的概念
  • centos7.9环境下mysql8数据库双机互备环境部署
  • git 报错git: ‘remote-https‘ is not a git command. See ‘git --help‘.
  • mysql学习教程,从入门到精通,SQL GROUP BY 子句(31)
  • pip 和 conda 的安装区别
  • 大学生就业招聘:Spring Boot系统的架构分析
  • 线段树模板
  • 【TypeScript】知识点梳理(三)
  • 题解:SP1741 TETRIS3D - Tetris 3D
  • EWSTM8 IAR for STM8 软件分享
  • 非机动车检测数据集 4类 5500张 电动三轮自行车 voc yolo