返回

单例模式(Singleton):让对象只能实例化一次,详解其实现方式

Android

单例模式的实现方式

同步锁

同步锁是最简单的一种实现方式,它通过在创建实例时对一个共享资源进行加锁来确保只有一个实例。以下是Java中使用同步锁实现单例模式的示例代码:

public class Singleton {

    private static Singleton instance;

    private Singleton() {}

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

双检锁式

双检锁式是在同步锁的基础上进行改进的一种实现方式。它通过两次检查实例是否存在来减少对共享资源的加锁次数,从而提高性能。以下是Java中使用双检锁式实现单例模式的示例代码:

public class Singleton {

    private static volatile Singleton instance;

    private Singleton() {}

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

饿汉式

饿汉式是在类加载时就创建实例的一种实现方式。这种方式可以保证单例对象的创建是线程安全的,但它也会导致在不需要使用该对象时也创建了它,从而浪费资源。以下是Java中使用饿汉式实现单例模式的示例代码:

public class Singleton {

    private static final Singleton instance = new Singleton();

    private Singleton() {}

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

单例模式的优缺点

优点:

  • 确保只有一个实例:单例模式可以保证一个类只有一个实例,从而避免了由于多实例而导致的资源浪费和状态不一致问题。
  • 提供全局访问点:单例模式提供了一个全局访问点,可以方便地访问和操作单例对象。
  • 线程安全:单例模式的实现方式通常都是线程安全的,可以保证在多线程环境下也能正常工作。

缺点:

  • 限制了类的可扩展性:单例模式限制了类的可扩展性,因为无法创建子类实例。
  • 增加耦合度:单例模式增加了类的耦合度,因为所有需要使用该类的类都必须知道它的单例特性。
  • 增加了测试难度:单例模式增加了类的测试难度,因为需要在多线程环境下进行测试以确保其线程安全性。