善学如春起之苗,不见其增,日有所长。假学如磨刀之石,不见其亏,日有所损。
单例模式: 顾名思义 他只有一个实例. 如果这个时候让你写一个单例模式 你怎么写.
- 首先 如果是一个单例的话 那他肯定不能实例化多次 他的实例 一定是一个私有的
(1) private static SingletonModel singletonModel = new SingletonModel();
(2) private static SingletonModel singletonModel = null;
这里有两点
(1) 直接实例化这个对象 在类加载的时候就实例化 这个时候就是饿汉式
(2) 这个时候不实例化这个对象 在获取实例化的时候才去加载 这就是懒汉式(懒加载)
- 既然是一个单例 那他的无参构造肯定是私有的 不能直接实例化的
private SingletonModel() {
}
3.获取实例化的方法
(1)如果是饿汉式的话直接返回就行了
public static SingletonModel getInstance() {
return singletonModel;
}
(2)如果懒汉的话判空一下 ;
public static SingletonModel getInstance() {
if (null == singletonModel) {
singletonModel = new SingletonModel();
}
return singletonModel;
}
如果是懒汉的话这里要考虑并发 也就是线程安全的问题了 多线程同时获取怎么办
可以通过 synchronized 方式来获取
public synchronized static SingletonModel getInstance() {
if (null == singletonModel) {
singletonModel = new SingletonModel();
}
return singletonModel;
}
二 静态内部类来实现
这里是由于类的静态属性只会在第一次加载类的时候初始化 实现的
/**
* 懒汉和饿汉
*
* @author dongzhiwei
* @date 2020/8/12 15:00
*/
public class SingletonModel {
//首先 如果是一个单例的话 那他肯定不能实例化多次 他的实例 一定是一个私有的
private static SingletonModel singletonModel = null;
private SingletonModel() {
}
private static class SingletonModelHoler{
public static SingletonModel singletonModel = new SingletonModel();
}
public synchronized static SingletonModel getInstance() {
return SingletonModelHoler.singletonModel;
}
}