单例应该是无状态(stateless)
difficult to test its client
两种常见方式:
类被初始化的时候, 对象会被生成:
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis(){}
}
反射可以生成多个对象,但可以通过在在构造器里抛出异常,来阻止构造多个对象
AccessObject.setAccessible()
静态工厂方法
静态方法的优势:
1.灵活。如果想返回响应的实例,在对应的线程里。
2.范型。
3.供应商。(模式)
如果没有以上三个有点,就用第一种方式
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis(){}
public stativ Elvis getInstance(){
return Elvis;
}
}
序列化:
添加transient , readResolve方法, 否则序列化,再反序列化时,会创建一个对象
public transient static Elvis elvis = new Elvis();
private Object readResolve(){
// let the garbage collector take care of the Elvis impersionator
return INSTANCE;
}
a single-element enum:
序列化不会重新创建对象,反射也没问题。最好的单例模式实现。
缺点,不能继承(但可以实现接口)
public enum Elvis {
INSTANCE;
public voild leave(){...}
}