单例模式

85 阅读2分钟

1. 概述

单例模式是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点

2. 问题

单例模式同时解决了两个问题,所以违反了单一职责原则:

同时负责管理自己的实例化和控制访问权限,导致了类的职责不单一。

  1. 保证一个类只有一个实例
  2. 为该类提供一个全局访问节点

3. 解决方案

所有单例的实现都包含以下两个相同的步骤:

  • 将默认构造函数设为私有,防止其他对象使用单例类的new运算符
  • 新建一个静态构建方法作为构造函数。该函数会"偷偷"调用私有构造函数来创建对象,并将其保存在一个静态成员变量中,此后所有对于该函数的调用都将返回这一缓存对象

4. 单例模式结构

image-20240612180140236

5.适用场景

  • 如果程序中的某个类对于所有客户端只有一个可用的实例,可以是哟个单例模式
  • 如果你需要更加严格地控制全局变量,可以使用单例模式

6.实现方式以及代码实例

实现方式:

  1. 在类中添加一个私有静态成员变量用于保存单例实例
  2. 声明一个公有静态构建方法用于获取单例实例
  3. 在静态方法中实现中实现"延迟初始化",该方法会在首次被调用时创建一个新对象,并将其存储在静态成员变量中,此后该方法每次被调用都返回该实例
  4. 将类的构造函数设为私有,类的静态方法仍能调用构造函数;但是其他对象不能
  5. 检查客户端代码,将对单例的构造函数的调用替换为对器静态构建方法的调用
 ​
 /**
  * 单例模式示例
  */
 public final class Singleton {
 ​
     private static Singleton instance = null;
 ​
     /**
      * 私有构造函数,防止外部实例化
      */
     private Singleton() {}
 ​
     /**
      * 获取单例实例的静态方法
      * @return 单例实例
      */
     public static Singleton getInstance() {
         // 双重检查锁定,确保线程安全
         if (instance == null) {
             synchronized (Singleton.class) {
                 if (instance == null) {
                     instance = new Singleton();
                 }
             }
         }
         return instance;
     }
 }
 ​