高频面试题-----Singleton《单例模式》
什么是Singleton ?
- Singleton : 在 Java 中即指单例设计模式,它是软件开发中最常用的设计模式之一;
- 单 :唯一
- 例 :示例
- 单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式;
- 例如 : 代表JVM运行环境的Runtime类;
要点
- 1)某个类只能由一个实例;
- 构造器私有化
- 2)它必须自行创建这个实例;
- 含有一个该类的静态变量来保存这个唯一的实例
- 3)它必须自行向整个系统提供这个实例:
- 对外提供获取该实例对象的方式:
- a 直接暴露
- b 用静态变量的get方法获取
几种常见的形式
- 饿汉式 : 直接创建对象,不存在线程安全问题
- 直接实例化饿汉式(简洁直观)
- 枚举式(最简洁)
- 静态代码块饿汉式(适合复杂实例化)
- 懒汉式 : 延迟创建对象
- 线程不安全(适用于单线程)
- 线程安全(使用于多线程)
- 静态内部类形式(适用于多线程)
废话不说,代码奉上,请兄台笑纳:
饿汉式:------ 直接创建对象,不存在线程安全问题
(1)直接实例化饿汉式 , 不管你用不用;
方式:
- (1) 构造器私有化
- (2) 自行创建,并且使用静态变量保存
- (3) 向外提供这个实例
- (4) 强调这是一个单例,我们可以用final修饰
public class SingletonEager {
public static final SingletonEager INSTANCE = new SingletonEager();
private SingletonEager(){
}
}
(2)直接实例化饿汉式 , 不管你用不用;
方式:
- (1) 枚举类型:表示类型的对象是有限的几个
- (2) 我们可以限定为一个,就成单例了;
public enum SingletonEagerEnum {
INSTANCE
}
(3)静态代码块(适合复杂实例化)
方式:
- 实现方式与直接实例化相似,只是增加为静态代码块,从而方便增加一些必要业务代码;
public class SingletonEagerStatic {
public static final SingletonEagerStatic INSTANCE;
static {
try {
Properties properties = new Properties();
properties.load(SingletonEagerStatic.class.getClassLoader().getResourceAsStream("application.properties"));
INSTANCE = new SingletonEagerStatic(properties.getProperty("info"));
} catch (IOException e) {
throw new RuntimeException(e)