注册式单例模式
注册式单例模式又称为登记式单例模式,就是将每一个实例都登记到某一个地方,通过唯一标示获取实例,注册式单例模式有两种,一种是枚举式单例模式,另一种为容器式单例模式。
枚举式单例模式
先来看枚举式单例模式的写法,代码如下:
先创建一个枚举类:
public enum EnumSingleton {
INSTANCE;
private Object data;
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public static EnumSingleton getInstance(){return INSTANCE;}
}
测试代码如下:
public static void main(String[] args) {
EnumSingleton s1 = null;
EnumSingleton s2 = EnumSingleton.getInstance();
s2.setData(new Object());
FileOutputStream fos = null;
try {
fos = new FileOutputStream("EnumSingleton.obj");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(s2);
oos.flush();
oos.close();
FileInputStream fis = new FileInputStream("EnumSingleton.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
s1 = (EnumSingleton) ois.readObject();
ois.close();
System.out.println(s1.getData());
System.out.println(s2.getData());
System.out.println(s1.getData() == s2.getData());
} catch (Exception e) {
e.printStackTrace();
}
}
运行结果显示:
没有做任何处理,我们发现运行结果和预期的一样,
有兴趣的同学可以反编译字节码进行分析。分析JDK中ObjectInputStream的readObject()方法。
结果:
枚举式单例模式在静态代码块中就给INSTANCE进行了赋值,是饿汉式单例模式的实现,枚举类型其实通过类名和类对象找到一个唯一的枚举对象。