📜  延迟加载设计模式(1)

📅  最后修改于: 2023-12-03 14:54:09.952000             🧑  作者: Mango

延迟加载设计模式

延迟加载设计模式(Lazy Load Design Pattern)是一种创建对象的设计模式,它延迟对象的实例化到真正需要的时候,从而避免了不必要的资源消耗。这种模式适用于那些创建对象非常耗费资源,并且在某些情况下可能不被实际使用的情况。

何时使用延迟加载设计模式

当使用某个对象的实例化过程较为复杂且耗资源时,可以考虑使用延迟加载设计模式。以下情况可能适合采用延迟加载:

  • 当对象实例化过程包含网络请求、数据库查询或其他资源获取操作时,延迟加载能够避免不必要的网络或数据库访问,提高程序的性能。
  • 当对象的实例化过程非常耗费内存或计算资源时,延迟加载可以节省系统资源,减少内存占用。
  • 当对象在某些情况下可能不会被使用到时,延迟加载可以避免创建不必要的对象,提高代码的效率。
实现延迟加载的方法

延迟加载设计模式可以通过多种方式实现,以下是常用的几种方法:

1. 懒汉式单例模式
public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 私有构造函数
    }

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

上述代码中,使用懒汉式单例模式实现了延迟加载。只有在第一次调用 getInstance() 方法时,才会实例化对象。

2. 使用代理模式
public interface Image {
    void display();
}

public class RealImage implements Image {
    private String filename;

    public RealImage(String filename) {
        this.filename = filename;
        loadImageFromDisk();
    }

    private void loadImageFromDisk() {
        System.out.println("Loading image: " + filename);
    }

    @Override
    public void display() {
        System.out.println("Displaying image: " + filename);
    }
}

public class ProxyImage implements Image {
    private RealImage realImage;
    private String filename;

    public ProxyImage(String filename) {
        this.filename = filename;
    }

    @Override
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}

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

上述代码中,使用代理模式实现了延迟加载。在 ProxyImage 类中,只有在调用 display() 方法时,才会实例化 RealImage 对象。

3. 使用虚拟代理
public interface Image {
    void display();
}

public class RealImage implements Image {
    private String filename;

    public RealImage(String filename) {
        this.filename = filename;
        loadImageFromDisk();
    }

    private void loadImageFromDisk() {
        System.out.println("Loading image: " + filename);
    }

    @Override
    public void display() {
        System.out.println("Displaying image: " + filename);
    }
}

public class ProxyImage implements Image {
    private RealImage realImage;
    private String filename;

    public ProxyImage(String filename) {
        this.filename = filename;
    }

    @Override
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}

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

上述代码中,使用虚拟代理实现了延迟加载。在 ProxyImage 类中,只有在调用 display() 方法时,才会实例化 RealImage 对象。

总结

延迟加载设计模式通过推迟对象的实例化,避免了不必要的资源消耗和性能浪费。它可以应用于任何对象的实例化过程复杂、耗时或可能不被使用的场景。常见的实现方式包括懒汉式单例模式、代理模式和虚拟代理。选择适合的延迟加载实现方式,可以提高程序的性能和效率。