「这是我参与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(延迟加载)。 延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。
后续介绍以下三种
双检锁式
静态内部类
枚举
\