单例模式
保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例
构造方法私有化,保证外界无法实例化。通过类内的获取实例的静态方法获取实例,将该实例创建为一个内部私有静态对象
饿汉式
类被加载时实例即被初始化
/**
* 饿汉式单例
* @author Jenson
*/
@Data
public class SingletonHungry {
/**
* 加载类时,就进行实例化
*/
private static SingletonHungry hInstance = new SingletonHungry();
private String desc = "饿汉式单例";
public static SingletonHungry getInstance(){
return hInstance;
}
}
懒汉式
类被加载时不被实例化,只在第一次调用时实例化。使用synchronized同步获取函数,以此保证多线程环境下只生成一个实例
@Data
public class SingletonLazy {
/**
* 加载类时,就进行实例化
*/
private static SingletonLazy lInstance = null;
/**
* 构造方法私有,保证外界无法实例化
*/
private SingletonLazy() {
System.out.println("懒汉式单例--实例化");
}
private String desc = "懒汉式单例";
synchronized public static SingletonLazy getInstance() {
if (lInstance == null) {
lInstance = new SingletonLazy();
}
return lInstance;
}
}
单例模式的类通常不会实现接口
单例模式与单一职责原则有冲突
Spring框架中,每个Bean 默认就是单例的
使用场景
- 要求生成唯一序列号的环境
- 整个项目中需要一个共享访问点或共享数据
- 创建一个对象需要消耗的资源过多,如访问IO或数据库等资源
- 需要定义大量静态常量或静态方法(如工具类)的环境。(也可使用static)
网友评论