设计模式——单例模式(Singleton)1

164 阅读2分钟

「这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战

设计模式——单例模式(Singleton)

单例模式是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这个类负责去创建自己的对象,并确保只有一个对象,并且该类提供了问类中唯一对象的接口。

实现的类中只有一个实例化对象,提供一个全局的访问点。进而降低对象之间的耦合度。

适用场景

主要有四点:

  • 需要频繁的实例化然后销毁的对象。
  • 创建对象耗时和消耗的资源过多,而且经常用到的对象。
  • 需要有特定状态和环境的。
  • 资源共享,例如访问数据库或文件的对象。

实现方式

饿汉式

单例创建时机不可控,在类加载时就 自动创建 单例

public class Singleton {  
    private static Singleton instance = new Singleton();  
    //构造函数设置为private权限禁止他人创建实例
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}

在类初次加载时会被初始化instance对象。避免了多线程的同步问题。因为没有加锁,所以执行效率很高

懒汉式

单例创建时机可控,只有在有需要的时候,才 手动创建 单例

public class Singleton {  
    private static Singleton instance;//懒汉式
    //构造函数设置为private权限禁止他人创建实例
    private Singleton (){}  //私有构造方法
  
    public static Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}

上述代码可以看出,只有在用到这个对象的时候才回去创建(“很懒”)。目前上面的实现方式最大的问题就是不支持多线程,是线程不安全的。getInstance加锁 synchronized保证线程安全(加锁会影响效率)。

具备 lazy loading(延迟加载)。 延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。

后续介绍以下三种

双检锁式

静态内部类

枚举

\