概述:随着jdk的版本的发展,单例模式的写法也随之增加并逐渐完善。博主从接触java就听到单例模式,闲来无事喜欢看杂七杂八的文章,今天看到枚举单例,突发感想记录下来。总结之,目前单例模式有三种写法。
一、最原始的单例模式写法
归纳起来三个步骤,静态方法、私有构造器、静态常量
public class A {
private static final A instance = new A();
private A(){
}
public static A getInstance(){
return instance;
}
}
如此单例模式就设计出来,如果考虑到线程安全的问题,getInstance可以如下写法
public static synchronized A getInstance(){
return instance;
}
第一种写法在序列化、反序列化上会产生多个对象,如此就违背了单例思想二、改进的单例模式写法
public class B {
private static final B instance = new B();
private B(){
}
public static B getInstance(){
return instance;
}
public Object readResolve(){
return instance;
}
}
添加readResolve()方法,防止序列化的时候出现多个实例
三、枚举单例模式
枚举单例写法需要jdk的配合,jdk1.5之后才可以这种写法
public enum TestSingleton {
INSTANCE;
TestSingleton(){
}
}
这种写法既简洁,又能防止序列化出现多个实例。为三种方法中,博主最推荐的单例模式写法。至于此种写法的序列化会不会出现多个实例的测试代码,博主就不写了,通过写入、读取的方式可以验证序列化前后的两个实例是同一个,相信大家可以自己写出这样的验证代码。
此文借鉴《effective java》
此文借鉴《effective java》