Singleton 是仅仅被实例化一次,Singleton通常被代表一个无形状对象
实现Singleton有两种常见的方法。这两种构造器方法都要保持构造器私有,并导出公有的静态成员,以便客户端能够访问该类的唯一实例
第一种方法为公有静态成员final域
public class Elvis{
public static final Elvis INSTANCE = new Elvis();
private Elvis() {}
}
私有构造器仅被调用一次,用来实例化公有的静态final 域Elvis.INSTANCE。由于缺少公有的或者受保护的构造器,所以保证了Elvis 的全局唯一性: 一旦Elvis 类被实例化,将只会存在一个Elvis 实例,不多也不少。客户端的任何行为都不会改变这一点, 但要提醒一点:享有特权的客户端可以借助AccessibleObject.setAccessible 方法,通过反射机制调用私有构造器。如果需要抵御这种攻击,可以修改构造器,让它在被要求创建第二个实例的时候抛出异常。
第二种方法
public class Elvis{
public static final Elvis INSTANCE = new Elvis();
public static Elvis getinstance() {return INSTANCE; }
private Elvis() {}
}
对于静态方法ElviS . getinstance 的所有调用,都会返回同一个对象引用,所以,
永远不会创建其他的Elvis 实例(上述提醒依然适用) 。
第三种方法使用枚举创建Singleton
public enum Singleton{
INSTANCE;
public void dosomething()
{
System.out.println(this + " is speaking!");
}
}