Singleton指仅仅被实例化一次的对象。Singleton通常被用来代表那些本质上唯一的系统组件。
在JDK1.5分布之前,实现Singleton的两种方式(饿汉式和懒汉式)均采用将构造器私有化,并导出共有的成员变量的方式实现。
(1)在第一种方式中,公有静态成员是final域:
public class Elvis{
public static final Elvis INSTANCE = NEW Elvis();
private Elvis(){ ... }
public void leaveTheBuilding(){ ... }
}
私有构造器仅被调用一次,用来实例化公有的静态final域Elvis.INSTANCE。由于缺少公有的或者受保护的构造器,所以保证了Elvis的全局唯一性。但是若客户端AccessibleObject.setAccessible方法,通过反射机制调用私有构造器。
(2)在第二种方式中,公有的成员是静态工厂方法:
public class Elvis{
public static final Elvis INSTANCE = NEW Elvis();
private Elvis(){ ... }
public static Elvis getInstance(){ return INSTANCE; }
public void leaveTheBuilding(){ ... }
}
对于静态方法Elvis.getInstance()的所有调用,都会返回一个对象引用,进而保证实例的唯一性。
公有域方法的主要好处在于,组成类的成员的声明很清楚的表明了这个类是一个singleton:公有的静态域是final。为了是实现的singleton类变成可序列化的,则需要在声明前添加“serializable”关键字。
(2)实现Singleton第三种方式是,编写一个包含单个元素的枚举类型。
public enum Elvis{
INSTANCE;
public void leaveTheBuilding(){ ... }
}