设计模式学习笔记

16 阅读2分钟

单例模式

什么是单例模式

在单例模式下,一个类仅允许创建一个对象,单例模式提供了一种控制类示例数目并节约资源的方法。

关键特性

  1. 单一实例;
  2. 全局访问点:单例类会提供一个全局访问该实例的静态方法;
  3. 自我实例化:单例类负责创建自己的唯一示例,并确保其他实例不被创建;

实现方式

  1. 懒汉式:实例在第一次请求时创建,实现简单,但存在线程安全问题;
  2. 饿汉式:实例在类加载时创建,线程安全,但是会造成资源浪费;
  3. 双重检查锁:线程安全,节省性能。综合了懒汉式和饿汉式的优点;
  4. 静态内部类:利用类加载机制保证初始化实例时只有一个,简洁,线程安全;
  5. 枚举法:简洁,线程安全,支持自动序列化机制,防止反射攻击,实现单例模式的最佳方法;

使用场景

  • 全局共享资源,如配置文件的读取。
  • 控制资源的访问,如数据库连接或线程池。
  • 用于日志记录、设备驱动对象等。

优点

  • 节省系统资源,减少系统开销。
  • 避免对资源的多重占用。
  • 提供了全局访问点。

缺点:

  • 违反了单一职责原则,单例类除了自身业务外,还要负责自管理。
  • 扩展困难,难以继承。
  • 在多线程环境下需要小心处理。

示例代码

  1. 懒汉式:
public class SingletonLazy {
    private static SingletonLazy instance;

    private SingletonLazy() {}

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

  1. 饿汉式
public class SingletonEager {
    private static final SingletonEager instance = new SingletonEager();

    private SingletonEager() {}

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

未完待续