返回

单例模式写法:独家解析多种实现

Android

单例模式是软件设计中一种常用的设计模式,它确保一个类只有一个实例,而且可以自行实例化并向整个系统提供这个实例。

单例模式的写法

单例模式有多种不同的写法,每种写法都有其独特的优缺点。

1. 饿汉式

饿汉式是最简单的单例模式实现方式。它在类加载的时候就创建实例,并将其存储在一个私有静态字段中。

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {}

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

2. 懒汉式

懒汉式在第一次访问该类时才创建实例。它使用一个私有静态字段来存储实例,并在第一次访问该类时使用同步锁来创建实例。

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

3. 双重检查锁

双重检查锁是一种优化过的懒汉式实现。它使用一个私有静态字段和一个同步锁来创建实例,但只在第一次访问该类时使用同步锁。

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

4. 静态内部类

静态内部类是一种比较新的单例模式实现方式。它使用一个静态内部类来创建实例,该内部类只在第一次访问该类时加载。

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

    private Singleton() {}

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

5. 枚举

枚举也是一种单例模式实现方式。它可以确保一个枚举类只有一个实例。

public enum Singleton {
    INSTANCE;

    private Singleton() {}

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

选择哪种单例模式写法

选择哪种单例模式写法取决于具体情况。饿汉式是最简单和最快的实现方式,但它在某些情况下可能导致资源浪费。懒汉式可以节省资源,但它在多线程环境中可能存在线程安全问题。双重检查锁可以解决懒汉式的线程安全问题,但它比懒汉式更复杂。静态内部类是一种比较新的实现方式,它既线程安全又延迟加载。枚举是最简单和最优雅的实现方式,但它不能继承。