返回

单例设计模式:饿汉与懒汉的故事

闲谈

单例设计模式概述

在软件设计中,我们经常会遇到需要确保某个类只有一个实例的情况,例如,数据库连接池、缓存系统、日志系统等。为了解决这个问题,我们可以使用单例设计模式。

单例设计模式是一种创建型设计模式,它确保某个类只有一个实例,并提供一个访问它的全局访问点。这意味着,无论我们从程序中的哪个地方访问这个类,我们都将始终得到同一个实例。

饿汉模式

饿汉模式是一种简单的单例设计模式实现。它在类加载的时候就创建好唯一的实例,并将其存储在静态变量中。这意味着,无论何时访问该类,我们都将直接得到这个唯一的实例。

饿汉模式的优点是简单易懂,并且线程安全。因为在类加载的时候就创建好实例,所以不需要考虑多线程并发访问的问题。

饿汉模式的缺点是,无论是否需要,都会在类加载的时候创建实例。这可能会浪费资源,特别是当实例很重的时候。

懒汉模式

懒汉模式是一种延迟创建单例实例的单例设计模式实现。它只有在第一次访问该类的时候才创建实例,并将其存储在静态变量中。这意味着,如果我们从未访问过该类,那么实例将不会被创建。

懒汉模式的优点是,只有在需要的时候才创建实例,从而节省了资源。

懒汉模式的缺点是,需要考虑多线程并发访问的问题。因为在第一次访问该类的时候才创建实例,所以如果有多个线程同时访问该类,那么可能会创建多个实例。为了解决这个问题,我们需要使用同步机制来确保只有一个线程能够创建实例。

饿汉模式与懒汉模式的比较

特性 饿汉模式 懒汉模式
实例创建时机 类加载时 第一次访问时
线程安全 否(需要同步机制)
资源消耗 无论是否需要都会创建实例 只有在需要时才创建实例

何时使用饿汉模式和懒汉模式

饿汉模式和懒汉模式都是单例设计模式的常见实现方式,但它们各有优缺点,适用场景也不同。

饿汉模式简单易懂,并且线程安全,适用于实例很轻、并且需要在类加载的时候就创建实例的情况。

懒汉模式只有在需要的时候才创建实例,适用于实例很重、并且不需要在类加载的时候就创建实例的情况。

Java中的单例设计模式实现

在Java中,我们可以使用以下代码来实现饿汉模式:

public class Singleton {

    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }
}

我们可以使用以下代码来实现懒汉模式:

public class Singleton {

    private static Singleton instance;

    private Singleton() {
    }

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

总结

单例设计模式是一种非常有用的设计模式,它可以帮助我们确保某个类只有一个实例,并提供一个访问它的全局访问点。饿汉模式和懒汉模式是单例设计模式的两种常见实现方式,它们各有优缺点,适用场景也不同。在实际应用中,我们可以根据具体情况选择合适的单例设计模式实现。