JAVA设计模式全解(独家AI解析)

JAVA设计模式全解(独家AI解析)

  • 一、JAVA介绍
  • 二、JAVA设计模式六大原则
  • 三、JAVA设计模式介绍
  • 四、JAVA设计模式详解
    • 4.1 单例模式
      • 4.1.1 懒汉式(Lazy Initialization)
      • 4.1.2 饿汉式(Lazy Initialization)
    • 4.2 代理模式
      • 4.2.1 静态代理
      • 4.2.2 动态代理
    • 4.3 策略模式

一、JAVA介绍

可以查阅JAVA快速入门体验

在这里插入图片描述

二、JAVA设计模式六大原则

在这里插入图片描述

设计模式的六大原则是一组指导性原则,它们帮助开发人员设计出灵活、可维护和可扩展的软件系统。以下是这些原则的简要介绍:

  1. 单一职责原则(Single Responsibility Principle,SRP):
    一个类应该只有一个引起它变化的原因。换句话说,一个类应该只有一个职责。这样可以提高类的内聚性,使其更容易理解、修改和测试。
  2. 里氏替换原则(Liskov Substitution Principle,LSP):
    所有使用父类引用的地方,都应该能够使用子类对象进行替换,而不会导致程序逻辑错误。子类应该保持父类的行为规范,遵循里氏替换原则可以提高系统的可靠性和可扩展性。
  3. 依赖倒置原则(Dependency Inversion Principle,DIP):
    高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于具体实现细节,具体实现细节应该依赖于抽象。通过依赖注入和面向接口编程等方式,可以实现依赖倒置原则。
  4. 接口隔离原则(Interface Segregation Principle,ISP):
    客户端不应该强迫依赖于它们不需要的接口。应该将大而全的接口拆分成小而精确的接口,以避免类依赖无用的接口方法。
  5. 迪米特法则(Law of Demeter,LoD):
    一个对象应该对其他对象有尽可能少的了解,只与直接的朋友通信。不要和陌生人说话。迪米特法则减少了对象之间的耦合,使系统更加灵活、可维护和可扩展。
  6. 开闭原则(Open-Closed Principle,OCP):
    软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。通过使用抽象、接口和多态等特性,可以使系统在不修改现有代码的情况下进行扩展。

这些原则共同为软件设计提供了指导,帮助开发人员构建高质量、可维护的系统。请注意,这些原则并非硬性规定,而是在实践中的经验总结,根据具体情况进行灵活应用。

三、JAVA设计模式介绍

在这里插入图片描述

Java中常用的设计模式有23种,这些模式是根据软件设计中常见的问题和解决方案而被提出的。以下是这些设计模式的分类和简要介绍:

  1. 创建型模式(Creational Patterns):
    • 单例模式(Singleton Pattern)
    • 工厂方法模式(Factory Method Pattern)
    • 抽象工厂模式(Abstract Factory Pattern)
    • 建造者模式(Builder Pattern)
    • 原型模式(Prototype Pattern)
  2. 结构型模式(Structural Patterns):
    • 适配器模式(Adapter Pattern)
    • 桥接模式(Bridge Pattern)
    • 组合模式(Composite Pattern)
    • 装饰器模式(Decorator Pattern)
    • 外观模式(Facade Pattern)
    • 享元模式(Flyweight Pattern)
    • 代理模式(Proxy Pattern)
  3. 行为型模式(Behavioral Patterns):
    • 责任链模式(Chain of Responsibility Pattern)
    • 命令模式(Command Pattern)
    • 解释器模式(Interpreter Pattern)
    • 迭代器模式(Iterator Pattern)
    • 中介者模式(Mediator Pattern)
    • 备忘录模式(Memento Pattern)
    • 观察者模式(Observer Pattern)
    • 状态模式(State Pattern)
    • 策略模式(Strategy Pattern)
    • 模板方法模式(Template Method Pattern)
    • 访问者模式(Visitor Pattern)

这些设计模式提供了在软件开发过程中常见问题的解决方案,并且可以帮助提高代码的可维护性、灵活性和复用性。在实际开发中,根据具体的需求和情况选择合适的设计模式是很重要的。

四、JAVA设计模式详解

主要对单例、代理和策略模式进行详解。

4.1 单例模式

在这里插入图片描述

单例模式是一种创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。它常用于需要共享资源或控制某些唯一资源的情况下。

单例模式的实现方式有多种,以下是其中两种常见的方式。

4.1.1 懒汉式(Lazy Initialization)

在首次调用获取实例的方法时才创建实例。如果实例已经存在,则直接返回该实例。这种方式延迟了实例的创建,但在多线程环境下需要注意线程安全。

示例代码如下:

public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数,防止外部实例化}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

4.1.2 饿汉式(Lazy Initialization)

饿汉式(Eager Initialization): 在类加载时就创建实例,确保实例的唯一性。这种方式简单直接,但可能会造成资源浪费,因为实例在整个程序生命周期中都存在。

示例代码如下:

public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {// 私有构造函数,防止外部实例化}public static Singleton getInstance() {return instance;}
}

以上代码中,通过将构造函数设为私有,防止外部直接实例化Singleton类。getInstance()方法提供了全局访问点,返回Singleton类的唯一实例。

使用示例:

public class Main {public static void main(String[] args) {Singleton singleton = Singleton.getInstance();// 使用singleton对象进行操作}
}

通过调用Singleton.getInstance()方法获取Singleton类的实例,然后可以使用该实例进行相应的操作。

需要注意的是,单例模式并不适用于所有场景,因为它引入了全局状态和共享资源,可能会增加代码的复杂性和耦合度。在使用单例模式时,需要权衡其优缺点,并根据具体需求进行选择。

4.2 代理模式

在这里插入图片描述

代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对另一个对象的访问。代理对象充当了客户端和目标对象之间的中介,可以在访问目标对象时添加额外的功能或控制。

代理模式的实现方式有多种,以下是其中两种常见的方式。

4.2.1 静态代理

在编译时就已经确定代理类和目标类的关系,即代理类是通过手动编码创建的。静态代理需要为每个目标类编写一个代理类,这样会导致代码冗余。

示例代码如下(Java):

// 目标接口
public interface Image {void display();
}// 目标类
public class RealImage implements Image {private String filename;public RealImage(String filename) {this.filename = filename;loadFromDisk();}private void loadFromDisk() {System.out.println("Loading image: " + filename);}public void display() {System.out.println("Displaying image: " + filename);}
}// 代理类
public class ImageProxy implements Image {private RealImage realImage;private String filename;public ImageProxy(String filename) {this.filename = filename;}public void display() {if (realImage == null) {realImage = new RealImage(filename);}realImage.display();}
}

在上述示例中,Image 接口定义了目标类和代理类的共同行为,RealImage 是目标类,负责加载和显示图像。ImageProxy 是代理类,用于控制对 RealImage 的访问。当调用 display() 方法时,代理类会首先判断目标对象是否已经创建,若未创建则创建目标对象,然后调用目标对象的 display() 方法。

使用示例(Java):

public class Main {public static void main(String[] args) {Image image = new ImageProxy("image.jpg");image.display();}
}

4.2.2 动态代理

在运行时动态生成代理类,无需手动编写代理类。通过使用 Java 提供的 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来实现动态代理。

示例代码如下(Java):

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;// 目标接口
public interface Image {void display();
}// 目标类
public class RealImage implements Image {private String filename;public RealImage(String filename) {this.filename = filename;loadFromDisk();}private void loadFromDisk() {System.out.println("Loading image: " + filename);}public void display() {System.out.println("Displaying image: " + filename);}
}// InvocationHandler 实现类
public class ImageInvocationHandler implements InvocationHandler {private Object target;public ImageInvocationHandler(Object target) {this.target = target;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before method: " + method.getName());Object result = method.invoke(target, args);System.out.println("After method: " + method.getName());return result;}
}// 使用动态代理创建代理对象
public class ProxyFactory {public static Object createProxy(Object target) {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new ImageInvocationHandler(target));}
}

在上述示例中,Image 接口和 RealImage 类与静态代理示例中相同。ImageInvocationHandler 类是实现 InvocationHandler 接口的代理处理器类,用于在调用目标方法前后添加额外的逻辑。ProxyFactory 类用于创建动态代理对象。

使用示例(Java):

public class Main {public static void main(String[] args) {Image realImage = new RealImage("image.jpg");Image imageProxy = (Image) ProxyFactory.createProxy(realImage);imageProxy.display();}
}

在上述示例中,通过调用 ProxyFactory.createProxy() 方法创建了一个代理对象 imageProxy,并将其转换为 Image 接口类型。当调用代理对象的 display() 方法时,代理处理器会先执行自定义的逻辑,然后再调用目标对象的 display() 方法。

需要注意的是,代理模式可以提供额外的功能,例如延迟加载、权限控制、日志记录等。通过代理对象,可以在不修改目标对象的前提下,对其进行控制和增强。

4.3 策略模式

在这里插入图片描述

策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。该模式将算法封装成独立的策略类,并使这些策略类可以相互替换,从而使得算法的变化独立于使用算法的客户端。

策略模式由三个主要角色组成:

  1. 环境(Context):环境类持有一个策略对象,并在需要时调用策略对象的方法。
  2. 抽象策略(Strategy):抽象策略定义了策略对象的接口,所有具体策略类都必须实现该接口。
  3. 具体策略(Concrete Strategy):具体策略类实现了抽象策略定义的接口,提供了具体的算法实现。

下面是一个示例代码,以展示策略模式的实现方式(Java):

// 抽象策略接口
public interface SortingStrategy {void sort(int[] array);
}// 具体策略类 - 冒泡排序
public class BubbleSortStrategy implements SortingStrategy {public void sort(int[] array) {System.out.println("Sorting array using Bubble Sort");// 冒泡排序的具体实现}
}// 具体策略类 - 快速排序
public class QuickSortStrategy implements SortingStrategy {public void sort(int[] array) {System.out.println("Sorting array using Quick Sort");// 快速排序的具体实现}
}// 环境类
public class SortManager {private SortingStrategy sortingStrategy;public void setSortingStrategy(SortingStrategy sortingStrategy) {this.sortingStrategy = sortingStrategy;}public void sortArray(int[] array) {if (sortingStrategy != null) {sortingStrategy.sort(array);}}
}

在上述示例中,SortingStrategy 是抽象策略接口,定义了排序算法的方法 sort()。BubbleSortStrategy 和 QuickSortStrategy 是具体策略类,分别实现了冒泡排序和快速排序算法。

SortManager 是环境类,它持有一个策略对象,并在需要时调用策略对象的 sort() 方法来进行排序操作。

使用示例(Java):

public class Main {public static void main(String[] args) {int[] array = {5, 2, 8, 3, 1};SortManager sortManager = new SortManager();// 使用冒泡排序策略sortManager.setSortingStrategy(new BubbleSortStrategy());sortManager.sortArray(array);// 使用快速排序策略sortManager.setSortingStrategy(new QuickSortStrategy());sortManager.sortArray(array);}
}

在上述示例中,首先创建了一个整型数组 array,然后通过创建 SortManager 对象来进行排序操作。通过调用 setSortingStrategy() 方法,可以在运行时设置不同的排序策略,然后调用 sortArray() 方法进行排序。

策略模式的优点是可以灵活地替换算法,使得算法的变化独立于使用算法的客户端。此外,策略模式还可以避免使用大量的条件语句来选择不同的算法,提高了代码的可读性和可维护性。

至此,JAVA设计模式全解(独家AI解析)分享完成,后续会陆续输出更多JAVA相关的篇章;查阅过程中若遇到问题欢迎留言或私信交流。

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

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

相关文章

nginx配置负载均衡--实战项目(适用于轮询、加权轮询、ip_hash)

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…

制药企业固体制剂设备管理及维护要点

在制药企业的生产过程中,固体制剂设备是至关重要的一环。有效管理和维护这些设备对于确保生产质量、提高生产效率以及延长设备寿命至关重要。本文将从以下三个方面介绍制药企业固体制剂设备的主要类型、常见管理问题以及设备维护的关键要点。 制药企业固体制剂设备主…

java智慧工地云平台源码,以物联网、移动互联网技术为基础,结合大数据、云计算等,实现工程管理绿色化、数字化、精细化、智能化的效果

智慧工地将更多人工智能、传感技术、虚拟现实等高科技技术植入到建筑、机械、人员穿戴设施、场地进出关口等各类物体中,围绕人、机、料、法、环等各方面关键因素,彻底改变传统建筑施工现场参建各方现场管理的交互方式、工作方式和管理模式,智…

分析概览 文章管理 草稿管理 图片管理 站点管理 主站 关于 登出 手写操作系统项目----进程

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家来访。 这里记录了,手写操作系统项目中关于进程的部分。 进程四要素 首先进程有四要素。 …

Linux软件包和进程管理

一、RPM软件包管理 1、RPM管理工具 (1)RPM是红帽包管理(Redhat Package Manager)的缩写。 由Red Hat公司提出的一种软件包管理标准。 是Linux各发行版中应用最广泛的软件包格式之一(还有debian的发行版deb安装包)。 RPM功能通过…

数据结构:选择题+编程题(每日一练)

目录 选择题: 题一: 题二: 题三: 题四: 题五: 编程题: 题一:单值二叉树 思路一: 题二:二叉树的最大深度 思路一: 本人实力有限可能对…

MySQL的索引——索引的介绍及其数据结构B+树 索引的类型 索引的使用及其失效场景 相关名词解释

前言 索引是存储引擎用于快速查找数据纪录的一种数据结构,索引是数据库中经常提及的一个词,究竟什么是索引,索引的数据结构是什么,索引有什么类型? 本篇博客尝试阐述数据库索引的相关内容,涉及什么是索引…

用 Java 在 PDF 中创建和管理图层,实现交互式文档

PDF 图层(也称为可见图层或附加图层等)是组织和管理 PDF 文档中内容可见性的一种方法。PDF 图层可用于创建交互式文档、隐藏或显示特定信息、创建多语言版本文档等。通过添加和删除图层,用户可以根据需要定制 PDF 文档指定内容的可见性与显示…

适用于物联网的UI设计工具都有哪些?

随着科学技术的飞速发展,“万物相连的互联网”时代逐渐成为现实。如今,物联网已经不是什么新词了。事实上,早在各种屏幕设备诞生之前,人们就与物理世界交织在一起,产生了无数的互动。如何将人们多年积累的互动经验与物…

蓝桥杯 Java 青蛙过河

import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改/**二分法从大(n)到小找足够小的步长前缀和记录每个位置的前面有的总石头数(一个石头表示可以容纳一个青蛙,一位置有多少个石头hi就是多少)&…

025-第三代软件开发-实现需求长时间未操作返回登录界面

第三代软件开发-实现需求长时间未操作返回登录界面 文章目录 第三代软件开发-实现需求长时间未操作返回登录界面项目介绍实现需求长时间未操作返回登录界面实现思路用户操作监控QML 逻辑处理 关键字: Qt、 Qml、 QTimer、 timeout、 eventFilter 项目介绍 欢迎…

秋季期中考复现xj

flow analysis 1 What is the backdoor file name that comes with the server?( Including file suffix) 服务器自带的后门文件是什么?(含文件后缀) 题目还要求最后把那个文件名MD5一下,再去提交 开始的前三题是流量分析的&…

发挥服务器的无限潜能:创意项目、在线社区和更多

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 ✨特色专栏&#xff1a…

设计模式:观察者模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《命令模式》 下一篇《策略模式》 简介: 观察者模式,它是一种行为型设计模式,它允许一个对象自动通知其依赖者(观察者)状态的变化。当被…

Windows Server服务器下的Linux子系统

导读Windows、Linux看似死敌一对,但其实微软对于开源实业还是相当支持的,Windows 10系统内就首次内置了一个Linux子系统(Windows Subsystem for Linux/WSL),允许开发者模拟Linux环境,而且有需要的可以直接从Windows应用商店下载SU…

顺序栈的实现----数据结构

栈的概念 对于栈(Stack),后进先出(Last In First Out,LIFO),栈也是一种线性表,只不过是一种操作受限的线性表,只能在一端操作,也就是不允许在中间进行查找、…

华为云全新上线Serverless应用中心,支持一键构建文生图应用

近日,华为云全新上线Serverless应用中心,提供了大量应用模板,让用户能够一键部署函数和周边依赖资源,节省部署时间,快速上手将应用部署到华为云函数计算FunctionGraph,并一键开通周边依赖资源。 本次Serve…

搭建一个windows的DevOps环境记录

边搭建边记录,整个DevOps环境的搭建可能会很久。。。 一、安装Jenkins: 参考:Jenkins基础篇--windows安装Jenkins-CSDN博客 注意上面选择JDK的路径,选择到安装目录,该目录并不一定要在path中配置了(就是…

Python中使用cv2.resize()函数批量自定义缩放图像尺寸

目录 常用插值缩放方法缩放示例代码总结 常用插值缩放方法 cv2.resize()函数中的interpolation参数指定了图像缩放时使用的插值方法。以下是常用的插值方法: cv2.INTER_NEAREST:最近邻插值。该方法通过选择最接近目标像素的原始像素来进行插值。它是最…

【Unity地编细节】为什么Unity笔刷在地形上面刷不出来

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏:unity细节和bug 😶‍🌫️优质专栏 ⭐【…