设计模式之单例模式

单例模式(Singleton Pattern)

是 Java 中最简单的设计模式之一。

特点

  1. 单例类只有一个私有构造函数,防止外部直接创建实例。
  2. 单例类维护一个私有静态成员变量,用于保存唯一的实例。
  3. 提供一个公共的静态方法来获取该实例,通常称为 "getInstance()" 方法。
  4. 在 "getInstance()" 方法中,如果实例尚未创建,则创建一个新实例并返回;如果已经存在实例,则返回已有的实例。

单例模式懒汉式 
 

public class Singleton {
    // 私有静态成员变量,用于保存唯一的实例
    private static Singleton instance;

    // 私有构造函数,防止外部直接创建实例
    private Singleton() {
        // 初始化实例的操作
    }

    // 公共静态方法,用于获取唯一的实例
    public static Singleton getInstance() {
        // 懒汉式单例模式:如果实例尚未创建,则在第一次调用时创建实例
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

线程安全的单例模式(双重检查锁定)

public class Singleton {
    // 私有静态成员变量,用于保存唯一的实例
    private volatile static Singleton instance;

    // 私有构造函数,防止外部直接创建实例
    private Singleton() {
        // 初始化实例的操作
    }

    // 公共静态方法,用于获取唯一的实例
    public static Singleton getInstance() {
        // 双重检查锁定:在实例未创建时才进行同步
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

单例模式饿汉式

public class Singleton {
    // 私有静态成员变量,用于保存唯一的实例,并在类加载时初始化
    private static Singleton instance = new Singleton();

    // 私有构造函数,防止外部直接创建实例
    private Singleton() {
        // 初始化实例的操作
    }

    // 公共静态方法,用于获取唯一的实例
    public static Singleton getInstance() {
        return instance;
    }
}

设计模式之单例模式_第1张图片

懒汉式和饿汉式对比

懒汉式和饿汉式都是单例模式的实现方式,它们分别有不同的特点和适用场景。下面对懒汉式和饿汉式进行比较:

  1. 实例化时机

    • 懒汉式:在第一次使用时才会创建实例,即"懒加载"。这意味着如果在应用程序的生命周期内没有使用单例对象,那么实例不会被创建,可以节省内存。
    • 饿汉式:在类加载时就会创建实例,即"急加载"。这意味着无论是否需要使用单例对象,实例都会在应用程序启动时创建,可能会浪费内存。
  2. 线程安全性

    • 懒汉式:最简单的懒汉式实现在多线程环境下可能存在线程安全问题,需要额外的同步措施来确保线程安全。可以使用双重检查锁定等机制来实现线程安全的懒汉式单例。
    • 饿汉式:饿汉式单例在类加载时就创建实例,不存在多线程竞争的问题,因此是线程安全的。
  3. 性能

    • 懒汉式:由于需要在运行时检查是否需要创建实例,因此可能会引入性能开销。双重检查锁定等线程安全机制也会增加一些开销。
    • 饿汉式:在类加载时创建实例,不需要额外的检查和同步,因此性能较好。
  4. 适用场景

    • 懒汉式:适用于需要延迟加载或者可能不会使用单例对象的情况。如果单例对象的创建和初始化比较耗时,可以选择懒汉式。
    • 饿汉式:适用于需要确保全局唯一性,且单例对象的创建和初始化不会导致性能问题的情况。如果单例对象的创建代价较低,可以选择饿汉式。

综上所述,懒汉式和饿汉式各有优缺点,应根据具体的需求和性能要求来选择合适的实现方式。如果线程安全和性能是首要考虑因素,可以选择饿汉式;如果需要延迟加载或者考虑内存消耗,可以选择懒汉式,并确保在多线程环境下实现线程安全。

你可能感兴趣的:(java设计模式,单例模式)