返回

Java 设计模式:单例模式的演变——从饱汉到饿汉

Android

饱汉模式与饿汉模式:单例设计模式的两种实现

在软件设计中,单例设计模式是一种创建只有一份实例的类的模式。单例模式有多种实现方式,其中饱汉模式和饿汉模式是最常用的两种。

饱汉模式

顾名思义,饱汉模式只会在需要的时候才创建单例实例。就像一个吃饱了的人不会急着再吃东西,饱汉模式也不会在类加载时就初始化单例,而是在第一次使用时才创建。

public class Singleton {

    private static Singleton instance;

    private Singleton() {}

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

在上面的例子中,Singleton类的单例实例instance在类加载时被初始化为null。当第一次调用getInstance()方法时,它会检查instance是否为null。如果是,则会创建一个新的Singleton实例并将其赋值给instance,然后返回instance

饿汉模式

饿汉模式与饱汉模式相反,它在类加载时就创建单例实例。就像一个饥饿的人会迫不及待地去寻找食物,饿汉模式会在类加载时就创建一个单例实例,并将其存储起来,以便以后使用。

public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {}

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

在上面的例子中,Singleton类的单例实例instance在类加载时就被初始化为一个新的Singleton实例。因此,在第一次调用getInstance()方法时,不需要进行任何检查,可以直接返回instance

两种模式的优缺点

饱汉模式

  • 优点: 只在需要的时候创建实例,不会浪费资源。
  • 缺点: 需要进行线程安全检查,以确保单例只被初始化一次。

饿汉模式

  • 优点: 实现简单,线程安全。
  • 缺点: 浪费资源,即使单例实例可能永远不会被使用,也会占用内存空间。

什么时候使用哪种模式

一般来说,如果单例实例可能不会被经常使用,那么可以使用饱汉模式。如果单例实例可能被经常使用,并且需要保证线程安全,那么可以使用饿汉模式。

常见问题解答

  1. 饱汉模式和饿汉模式有什么区别?

饱汉模式只会在需要的时候才创建单例实例,而饿汉模式会在类加载时就创建单例实例。

  1. 哪种模式更好?

没有一种模式绝对比另一种模式更好,需要根据具体场景选择合适的模式。

  1. 饱汉模式如何确保线程安全?

饱汉模式需要使用线程安全检查,例如双重检查锁定,以确保单例只被初始化一次。

  1. 饿汉模式如何避免浪费资源?

如果单例实例不太可能被使用,可以使用延迟加载的饿汉模式变种,例如使用静态内部类或枚举。

  1. 我应该使用哪种模式来实现单例?

如果单例实例可能不会被经常使用,那么可以使用饱汉模式。如果单例实例可能被经常使用,并且需要保证线程安全,那么可以使用饿汉模式。