单例:保证一个类只有一个实例,并提供一个访问的全局访问点。保证定义的类只能new出一个对象(实例),满足于一些只允许实例化一次的场景。
一个简单的单例模式需要:
1.对无参构造私有化;
2.提供公共方法,在当前类没有实例时创建实例,有实例则返回实例。
单例模式分为:懒汉模式(饱汉模式)和饿汉模式。
饱汉式的特点:用的时候再new,是线程不安全的。
public class Single {
//1.私有化无参构造
private Single() {};
//2.创建一个私有静态的Single对象
private static Single instance ;
//3.提供公共访问的get方法
public static Single getInstance(){
if(instance == null){
instance = new Single();
}
return instance;
}
}
饿汉式的特点: final创建实例,丧失灵活性,线程安全。
class Single2 {
//1.无参构造私有化
private Single2(){}
//2.final创建一个私有对象
private static final Single2 instance = new Single2();
//提供公共访问方法
public static Single2 getInstance(){
return instance;
}
}
---------------2019.1.2补充--------------------------------
补充的内容如下知识结构图所示:
饿汉模式除了具有上面的静态final修饰定义一个指定内存的对向外,也可以使用静态代码块初始化:
public class StaticCodeBlock {
private static StaticCodeBlock instance;
static {
instance = new StaticCodeBlock();
}
private StaticCodeBlock() {}
public static StaticCodeBlock getInstance() {
return instance;
}
}
以上常用单例模式依然存在问题:使用静态final实例化对象或者使用静态代码块不能解决在反序列化、反射、克隆时重新生成对象的问题。