【地铁上的设计模式】--创建型模式:单例模式(四)--静态内部类单例

2023-04-28 19:58:14 浏览数 (2)

什么是静态内部类单例

静态内部类单例是一种单例模式的实现方式,它使用一个私有的静态内部类来持有单例对象,从而保证单例对象的唯一性。静态内部类只有在被调用时才会被加载,同时创建唯一的单例对象。由于静态内部类只会被加载一次,因此它也具有懒加载的能力。静态内部类单例既保证了线程安全,又具有较好的性能表现,是一种比较优秀的单例模式实现方式。

如何实现静态内部类单例

实现静态内部类单例的步骤如下:

  1. 创建一个外部类,构造方法为私有,防止外部类直接实例化。
  2. 在外部类中定义一个静态内部类,内部类中定义一个静态常量的外部类实例,外部类的实例化在内部类加载时完成。
  3. 在外部类中提供一个静态方法,返回静态内部类中的外部类实例。
  4. 外部类的实例化过程是在内部类加载时完成的,所以不会出现线程安全问题。
  5. 使用静态内部类单例模式的优点是既能够实现延迟加载,又能够保证线程安全,且实现简单。

Java实现

代码语言:javascript复制
public class Singleton {
    private Singleton() {}

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

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

在上面的代码中,外部类Singleton定义了一个私有的构造函数,保证该类不能在外部被实例化。内部类SingletonHolder持有一个静态变量INSTANCE,并在静态初始化块中初始化该变量。外部类提供一个公共的静态方法getInstance(),该方法返回SingletonHolder中的静态变量INSTANCE,从而获取单例对象。这样,在调用getInstance()方法时,才会加载SingletonHolder类,从而完成单例对象的初始化。由于静态内部类只会被加载一次,所以该实现方式具有较好的线程安全性和性能表现。

C#实现 在C#中,静态内部类单例的实现方式与Java类似,只需要将内部类定义为私有嵌套类即可。具体实现方式可参考下面的示例代码:

代码语言:javascript复制
public sealed class Singleton
{
    private Singleton() { }

    private class SingletonHolder
    {
        internal static readonly Singleton instance = new Singleton();
    }

    public static Singleton Instance
    {
        get { return SingletonHolder.instance; }
    }
}

在上面的代码中,SingletonHolder类定义为私有嵌套类,Singleton类提供一个公共的静态属性Instance来获取单例对象。静态变量instance在静态初始化块中被初始化,保证了单例对象的唯一性和线程安全性。

总结

静态内部类单例模式能够实现延迟加载、线程安全和高效访问,且实现简单,是单例模式中最优秀的一种实现方式。其缺点是不能够通过反射来创建新的实例,需要特殊处理。

0 人点赞