设计模式之单例模式

单例模式

  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;
          }
          
      }
相关推荐
码匠许师傅8 小时前
【设计模式精讲】29.行为型模式总结与对比(Behavioral Patterns Summary)
c++·设计模式·uml
geovindu11 小时前
CSharp: Observer Pattern
开发语言·后端·观察者模式·设计模式·c#·.netcore·行为模式
YHHLAI1 天前
NestJS 后端开发实战:从设计模式到 CRUD 全栈
设计模式
2401_868534782 天前
长远目标 Long-term Goal 老题沿用
设计模式·需求分析
吃饱了得干活2 天前
Java设计模式实战:一个支付模块的重构之旅,层层递进理解设计模式精髓
后端·设计模式·架构
vivo互联网技术2 天前
软件不是从数据开始,而是从现实开始 | KDC 系列 01
设计模式·架构·领域驱动设计
码匠许师傅2 天前
【设计模式精讲】27.模板方法模式(Template Method)
c++·设计模式·uml·模板方法模式
码匠许师傅2 天前
【设计模式精讲】28.访问者模式(Visitor)
java·设计模式·访问者模式
码匠许师傅3 天前
【设计模式精讲】26.策略模式(Strategy)
c++·设计模式·策略模式·uml
Ysx3 天前
AI 问答不再"一本正经地胡说":30 轮提示词迭代,沉淀 4 条防幻觉铁律
设计模式