自己最熟悉的设计模式估计就是单例模式了:
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
if(INSTANCE != null) {
throw new IllegalStateException("Trying to get more than one instance.");
}
}
public static Singleton getInstance() {
return INSTANCE;
}
}
这种方式可以防止用反射调用私有构造方法来创建多个对象,却不能防止通过反序列化得到多个对象,EJ提倡使用enum实现单例:
FileOutputStream fos = new FileOutputStream("out.data");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(d1);
fos.close();
oos.close();
FileInputStream fis = new FileInputStream("out.data");
ObjectInputStream ois = new ObjectInputStream(fis);
Object o = ois.readObject();
fis.close();
ois.close();
Singleton d2 = (Singleton)o;
System.out.println(d2);
System.out.println(d1 == d2);
}
}
enum Singleton implements Serializable {
INSTANCE;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "[" + name + "]";
}
}
因为一个enum常量(这里是INSTANCE)代表了一个enum的实例,enum类型只能有这些常量实例。标准保证enum常量(INSTANCE)不能被克隆,也不会因为反序列化产生不同的实例,想通过反射机制得到一个enum类型的实例也不行的。