单例模式详解

发布于:2025-02-11 ⋅ 阅读:(35) ⋅ 点赞:(0)

单例模式(Singleton Pattern)是一种创建型设计模式,其核心目的是确保一个类只有一个实例,并提供一个全局访问点。以下是单例模式的详解:
定义
单例模式确保一个类只有一个实例,并提供一个全局访问点。这个实例被所有需要它的部分共享。
结构
单例模式通常包含以下几个部分:
1.  私有构造函数:确保外部代码不能通过new关键字创建类的实例。
2.  私有静态变量:保存类的唯一实例。
3.  公有静态方法:提供一个全局访问点,返回类的唯一实例。
实现方式
单例模式有几种不同的实现方式,包括懒汉式、饿汉式、双重检查锁定(Double-Checked Locking)和静态内部类等。
1. 饿汉式(Eager Initialization)
在类加载时就创建实例,线程安全,但不是按需初始化。
public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    
    private Singleton() {
    }
    
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

2. 懒汉式(Lazy Initialization)
按需创建实例,但需要处理线程安全问题。
public class Singleton {
    private static Singleton instance;
    
    private Singleton() {
    }
    
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

3. 双重检查锁定(Double-Checked Locking)
既按需创建实例,又确保线程安全。
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;
    }
}

4. 静态内部类(Static Nested Class)
利用Java的类加载机制保证线程安全,并且实现了懒加载。
public class Singleton {
    private Singleton() {
    }
    
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

优点
1.  控制实例数量:确保一个类只有一个实例。
2.  资源节约:特别是在创建实例需要消耗大量资源时。
3.  全局访问点:提供全局访问点,方便访问实例。
缺点
1.  全局状态:单例持有的应用状态可能会导致测试困难和代码间的耦合。
2.  扩展困难:单例模式在某种程度上违反了开闭原则,扩展时需要修改实例化代码。
3.  线程安全问题:在多线程环境下需要额外处理线程安全问题。
应用场景
1.  配置管理器:配置信息全局访问,如数据库连接信息。
2.  连接池:数据库连接池通常设计为单例模式。
3.  日志记录器:全局日志记录器实例。
单例模式是一种简单但强大的设计模式,适用于需要严格控制实例数量的场景。


网站公告

今日签到

点亮在社区的每一天
去签到