创建型-单例模式(Singleton)

单例模式(Singleton Pattern)是设计模式中的一种,它的主要目的是确保一个类仅有一个实例,并提供一个全局访问点。以下是单例模式的一些关键知识点:

1.定义与目的

  • 确保一个类只有一个实例,并提供一个全局访问点。
  • 在软件系统中,经常有需要这样一个特殊类,它负责管理系统中的重要资源(如数据库连接、文件系统等),保证在系统中只有一个实例存在,避免出现多个实例之间的状态不一致问题。

2.实现方式

  • 饿汉式(静态常量):在类加载时就完成了实例化,避免了线程同步问题。
java 复制代码
public class Singleton {  
    private static final Singleton INSTANCE = new Singleton();  
      
    private Singleton() {}  
      
    public static Singleton getInstance() {  
        return INSTANCE;  
    }  
}
  • 懒汉式 (双重检查锁定):在第一次调用getInstance()方法时才进行实例化,并使用了双重检查锁定来避免多次同步。
java 复制代码
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;  
    }  
}
  • 静态内部类:利用了classloader的机制来保证初始化instance时只有一个线程。
java 复制代码
public class Singleton {  
    private Singleton() {}  
      
    private static class SingletonHolder {  
        private static final Singleton INSTANCE = new Singleton();  
    }  
      
    public static Singleton getInstance() {  
        return SingletonHolder.INSTANCE;  
    }  
}
  • 枚举:利用枚举的特性,不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。
java 复制代码
public enum Singleton {  
    INSTANCE;  
      
    // 其他方法...  
}

3.适用场景:

  • 当一个类只能有一个实例,而且客户可以从一个众所周知的访问点访问它时。
  • 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

4.注意事项

  • 构造函数必须私有,以防止其他类通过new关键字创建实例。
  • 考虑线程安全,特别是在懒汉式实现中。
  • 考虑序列化问题,防止反序列化时重新创建对象。

5.优缺点

  • 优点
  1. 在内存中只有一个对象,减少了内存开销。
  2. 避免了对资源的多重占用。
  3. 可以在系统设置全局的访问点,优化和共享资源访问。
  • 缺点
  1. 没有接口,扩展困难。
  2. 在并发测试时,可能出现多个Singleton实例。

6.使用场景

  • 数据库连接池、缓存管理、线程池等。
  • Windows的任务管理器就是一个单例模式,同时只能打开一个窗口。
相关推荐
Albert Edison1 天前
【项目设计】C++ 高并发内存池
数据结构·c++·单例模式·哈希算法·高并发
繁华似锦respect1 天前
HTTPS 中 TLS 协议详细过程 + 数字证书/签名深度解析
开发语言·c++·网络协议·http·单例模式·设计模式·https
yoyo君~3 天前
深入理解PX4飞控系统:多线程并发、原子操作与单例模式完全指南
学习·单例模式·机器人·无人机
繁华似锦respect4 天前
C++ 设计模式之单例模式详细介绍
服务器·开发语言·c++·windows·visualstudio·单例模式·设计模式
xunyan62344 天前
面向对象(下)-设计模式与单例设计模式
java·单例模式·设计模式
隔山打牛牛4 天前
单例模式:高效实现全局唯一实例
单例模式
stormsha4 天前
Java 设计模式探秘饿汉式与懒汉式单例模式的深度解析
java·单例模式·设计模式·java-ee
口袋物联4 天前
设计模式之单例模式在 C 语言中的应用(含 Linux 内核实例)
c语言·单例模式·设计模式
__万波__4 天前
二十三种设计模式(一)--单例模式
java·单例模式·设计模式
第二只羽毛5 天前
单例模式的初识
java·大数据·数据仓库·单例模式