单例模式肯定有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
1.单例的实现
public class Singleton {
private Singleton(){};
private static Singleton st = null;
public static Singleton getSt(){
if(null == st){
st = new Singleton();
}
return st;
}
}
2.测试
/**
* 单例模式的demo
* 使用场景:我们只希望在JVM中,只有一份实例存在
* @author zy
*/
public class M {
public static void main(String[] args) {
Singleton st = Singleton.getSt();
}
}
tips:
单例模式,细分为很多种,比如懒汉式、饿汉式、双检索等写法。文中演示的是懒汉式写法。其实最好的写法是使用枚举来实现,因为枚举从编译的层面,控制只实例化一次,并且拒绝了反射来第二次实例化
破坏单例模式
1.使用反射
杜绝使用反射得到新对象,需要在构造方法内做文章,在构造方法内进行判断实例变量是否已经存在了。
2.使用序列化
假设得到对象a,写入到a.txt,再读取a.txt文件内容,转换为对象a2,可以看到a2和a不是同一个对象。若要杜绝这种情况,需要实现readResolve()
更详细的单例设计模式,请戳我