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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: JAVA设计模式详解(独家AI解析)

一、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)
  1. 结构型模式(Structural Patterns):
  • 适配器模式(Adapter Pattern)
  • 桥接模式(Bridge Pattern)
  • 组合模式(Composite Pattern)
  • 装饰器模式(Decorator Pattern)
  • 外观模式(Facade Pattern)
  • 享元模式(Flyweight Pattern)
  • 代理模式(Proxy Pattern)
  1. 行为型模式(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相关的篇章;查阅过程中若遇到问题欢迎留言或私信交流。

相关文章
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术深度解析:从基础到应用的全面介绍
人工智能(AI)技术的迅猛发展,正在深刻改变着我们的生活和工作方式。从自然语言处理(NLP)到机器学习,从神经网络到大型语言模型(LLM),AI技术的每一次进步都带来了前所未有的机遇和挑战。本文将从背景、历史、业务场景、Python代码示例、流程图以及如何上手等多个方面,对AI技术中的关键组件进行深度解析,为读者呈现一个全面而深入的AI技术世界。
72 10
|
4天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
3天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
3天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
3天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
3天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
3天前
|
设计模式 Java 程序员
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
本系列文章聚焦于面向对象软件设计中的设计模式,旨在帮助开发人员掌握23种经典设计模式及其应用。内容分为三大部分:第一部分介绍设计模式的概念、UML图和软件设计原则;第二部分详细讲解创建型、结构型和行为型模式,并配以代码示例;第三部分通过自定义Spring的IOC功能综合案例,展示如何将常用设计模式应用于实际项目中。通过学习这些内容,读者可以提升编程能力,提高代码的可维护性和复用性。
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
|
2天前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
4天前
|
机器学习/深度学习 人工智能 物联网
AI赋能大学计划·大模型技术与应用实战学生训练营——湖南大学站圆满结营
12月14日,由中国软件行业校园招聘与实习公共服务平台携手魔搭社区共同举办的AI赋能大学计划·大模型技术与产业趋势高校行AIGC项目实战营·湖南大学站圆满结营。
AI赋能大学计划·大模型技术与应用实战学生训练营——湖南大学站圆满结营
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
转载:【AI系统】AI的领域、场景与行业应用
本文概述了AI的历史、现状及发展趋势,探讨了AI在计算机视觉、自然语言处理、语音识别等领域的应用,以及在金融、医疗、教育、互联网等行业中的实践案例。随着技术进步,AI模型正从单一走向多样化,从小规模到大规模分布式训练,企业级AI系统设计面临更多挑战,同时也带来了新的研究与工程实践机遇。文中强调了AI基础设施的重要性,并鼓励读者深入了解AI系统的设计原则与研究方法,共同推动AI技术的发展。
转载:【AI系统】AI的领域、场景与行业应用

推荐镜像

更多