欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

java设计模式详解独家ai解析工程师,java设计模式总结

终极管理员 知识笔记 120阅读

4.1.1第一次调用获取实例的方法时,惰性初始化会创建一个实例。如果实例已经存在,直接返回。这种方式延迟了实例的创建,但是多线程环境下要注意线程安全。示例代码如下:公共类singleton {私有静态singleton实例;单身士兵

on() { // 私有构造函数防止外部实例化 } 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 策略模式

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

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

环境Context环境类持有一个策略对象并在需要时调用策略对象的方法。抽象策略Strategy抽象策略定义了策略对象的接口所有具体策略类都必须实现该接口。具体策略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相关的篇章查阅过程中若遇到问题欢迎留言或私信交流。

标签:
声明:无特别说明,转载请标明本文来源!