设计模式学习1:单例模式

一、什么是单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,其核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。单例模式在许多场景中都非常有用,例如配置管理器、日志记录器、线程池等,这些对象通常只需要一个实例,且需要在多个地方被访问。

二、单例模式的实现方式

单例模式有多种实现方式,常见的有饿汉式、懒汉式(双重校验锁)、静态内部类和基于enum的单例模式。下面分别介绍这些实现方式及其特点。

(一)饿汉式单例模式

饿汉式单例模式是最简单的一种实现方式,它在类加载时就创建单例实例。

实现代码
public class Singleton {
    // 在类加载时创建单例实例
    private static final Singleton INSTANCE = new Singleton();

    // 私有构造方法,防止外部直接实例化
    private Singleton() {}

    // 提供全局访问点
    public static Singleton getInstance() {
        return INSTANCE;
    }
}
特点
  • 优点:实现简单,线程安全。

  • 缺点:无法实现延迟加载,实例在类加载时就会被创建,即使从未使用过。

(二)懒汉式单例模式(双重校验锁)

懒汉式单例模式实现了延迟加载,即在第一次使用时才创建实例。为了保证线程安全,通常使用双重校验锁(Double-Checked Locking)。

实现代码
public class Singleton {
    // 使用volatile关键字确保线程安全
    private static volatile Singleton INSTANCE = null;

    // 私有构造方法
    private Singleton() {}

    // 提供全局访问点
    public static Singleton getInstance() {
        if (INSTANCE == null) { // 第一次检查
            synchronized (Singleton.class) { // 同步代码块
                if (INSTANCE == null) { // 第二次检查
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}
特点
  • 优点:实现了延迟加载,线程安全。

  • 缺点:代码复杂,需要正确使用volatile关键字,否则可能会出现线程安全问题。

(三)静态内部类单例模式

静态内部类单例模式利用了Java类加载机制的线程安全特性,是一种优雅的实现方式。

实现代码
public class Singleton {
    // 私有构造方法
    private Singleton() {}

    // 定义静态内部类
    private static class SingletonHolder {
        // 在静态内部类中创建单例实例
        private static final Singleton INSTANCE = new Singleton();
    }

    // 提供全局访问点
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}
特点
  • 优点:实现了延迟加载,线程安全,代码简洁。

  • 缺点:依赖于JVM的类加载机制,理解起来可能稍显复杂。

(四)基于enum的单例模式

基于enum的单例模式是Java中一种非常简单且线程安全的单例实现方式。

实现代码
public enum Singleton {
    INSTANCE;

    // 可以添加其他方法
    public void doSomething() {
        System.out.println("Doing something...");
    }
}
特点
  • 优点:线程安全,实现简单,天然支持序列化。

  • 缺点:无法实现延迟加载,实例在类加载时就会被创建。

三、单例模式的适用场景

单例模式适用于以下场景:

  1. 需要全局访问点:例如配置管理器、日志记录器等。

  2. 资源有限:例如线程池、数据库连接池等。

  3. 避免重复初始化:确保某个资源只被初始化一次。

四、单例模式的优缺点

(一)优点

  • 全局唯一性:确保一个类只有一个实例。

  • 全局访问:提供一个全局访问点,方便在多个地方使用。

  • 资源高效利用:避免重复创建实例,节省资源。

(二)缺点

  • 单例依赖:如果单例类中存在错误,可能会影响整个系统的运行。

  • 延迟加载问题:某些实现方式(如懒汉式)需要额外的线程安全机制。

  • 序列化问题:需要额外处理序列化问题,否则可能会破坏单例。

五、总结

单例模式是一种非常实用的设计模式,适用于需要全局访问且资源有限的场景。不同的实现方式各有优缺点,开发者可以根据具体需求选择合适的实现方式。例如:

  • 如果需要延迟加载且线程安全,可以选择静态内部类单例模式

  • 如果对延迟加载没有要求,且希望实现简单,可以选择基于enum的单例模式

  • 如果对延迟加载没有要求且希望在类加载时就初始化,可以选择饿汉式单例模式

无论选择哪种实现方式,都需要确保单例的线程安全性和全局唯一性,这是单例模式的核心要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值