设计模式之单例模式

单例模式

  1. 单例模式(Singleton)是设计模式中最常见、最简单的模式之一 ,属于构建/建造型模式

  2. 设计模式(design pattern):针对软件开发过程中的某一类问题形成的方案。到目前为止,在软件开发过程中,有上百种设计模式,其中比较常用的有24种

  3. 单例模式,顾名思义,指的是在全局只存在唯一的一个实例对象

  4. 单例模式有六种实现方式:饿汉式懒汉式 、单重所、双重锁(DCL)、枚举式、内部类式

    1. 饿汉式

      java 复制代码
      public class A {
          // 在类中准备好一个对象,希望所有的使用者都只用准备号的唯一对象
          // 饿汉式:在定义对象的时候就初始化对象
          // 缺点:无论是否需要使用这个对象,在第一次调用这个类的时候都会初始化这个对象,从而增长了类的加载时间
          // 优点:没有线程的并发问题 - 类只加载一次,所以静态对象也只初始化一次
          private static final A a = new A();
          // 不允许在类外随便创建对象 - 构造函数私有化
          private A(){}
          public static A get(){return a;}
      }
    2. 懒汉式

      java 复制代码
      public class A {
          
          // 懒汉式:在定义对象的时候不初始化对象,而是在第一次调用方法的时候再初始化这个对象
          // 优点:在有需要的时候才会初始化对象,从而缩短了类的加载时间
          // 缺点:会产生线程的并发问题
          private static A a;
         
          private A(){}
          public static A get(){
              if(a == null) a = new A();
              return a;
          }
      }
    3. 单重锁

      java 复制代码
      public class A {
          
          private static A a;
         
          private A(){}
          public static A get(){
              // 优点:保证线程的并发安全
              // 缺点:锁本质上就是保证线程的"独占",因此加锁和解锁都需要消耗资源
              // 当对象被初始化之后,后续的所有的线程都需要先加锁,然后判断是否为空,再解锁,也就意味着所有的线程都需要经历锁的过程
              synchronized(A.class){
                  if(a == null) a = new A();
              }
              return a;
          }
      }
    4. 双重锁(DCL - Double Check Lock)

      java 复制代码
      public class A {
          
          private static A a;
         
          private A(){}
          public static A get(){
              if(a == null){
                  synchronized(A.class){
                  	if(a == null){
                      	synchronized(A.class){
                              a = new A();
                          }
                      }
              	}
              }
              return a;
          }
      }
    5. 枚举式

      java 复制代码
      enum A{
          a
      }
    6. 内部类式

      java 复制代码
      public class A {
          
          public static class AI{
              private static final AI instance = new AI();
          }
          
          public static AI getInstance(){
              return AI.instance;
          }
          
      }
相关推荐
总是难免25 分钟前
设计模式 - 单例模式 - Tips
java·单例模式·设计模式
Java致死5 小时前
设计模式Java
java·开发语言·设计模式
ghost14317 小时前
C#学习第23天:面向对象设计模式
开发语言·学习·设计模式·c#
敲代码的 蜡笔小新21 小时前
【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓
unity·设计模式·c#·迭代器模式
敲代码的 蜡笔小新2 天前
【行为型之命令模式】游戏开发实战——Unity可撤销系统与高级输入管理的架构秘钥
unity·设计模式·架构·命令模式
m0_555762902 天前
D-Pointer(Pimpl)设计模式(指向实现的指针)
设计模式
小Mie不吃饭2 天前
【23种设计模式】分类结构有哪些?
java·设计模式·设计规范
君鼎2 天前
C++设计模式——单例模式
c++·单例模式·设计模式
敲代码的 蜡笔小新2 天前
【行为型之中介者模式】游戏开发实战——Unity复杂系统协调与通信架构的核心秘诀
unity·设计模式·c#·中介者模式
令狐前生2 天前
设计模式学习整理
学习·设计模式