一、配景
所谓的Singleton是指仅仅被实例化一次的类,Singleton凡是被用来代表那些本质上独一的系统组件。
实现Singleton有以下三种要领:
①. 私有结构器,公有静态final域。
②. 私有结构器,公有静态工场要领。
③. 单位素列举范例(首选)。
二、私有结构器,公有静态final域
public class Singleton1 {
public static final Singleton1 INSTANCE = new Singleton1(); // 公有静态final域
/*
* 私有结构器
*/
private Singleton1() {
}
}
三、私有结构器,公有静态工场要领
缺点1:享有特权的客户端可以借助AccessibleObject.setAccessible要领,通过反射机制,挪用私有结构器,假如需要抵制这种进攻,可以修改结构器,让它在被要求建设第二个实例的时候抛出异常。
public class Singleton2 {
private static final Singleton2 INSTANCE = new Singleton2(); // 私有静态final域
/*
* 私有结构器
*/
private Singleton2() {
}
/*
* 公有静态工场要领
*/
public static Singleton2 getInstance() {
return INSTANCE;
}
}
查察本栏目
缺点2:每次反序列化一个序列化的实例时,城市建设一个新的实例,为了防备这种环境,不只要实现Serializable接口,还要提供一个readResolve要领。
public class Singleton2 implements Serializable {
private static final long serialVersionUID = 1L;
private static final Singleton2 INSTANCE = new Singleton2(); // 私有静态final域
/*
* 私有结构器
*/
private Singleton2() {
}
/*
* 公有静态工场要领
*/
public static Singleton2 getInstance() {
return INSTANCE;
}
/*
* 反序列化确保只有一个实例
*/
public Object readResolve() {
return INSTANCE;
}
}
四、单位素列举范例
最佳要领:更简捷,无偿提供序列化机制,绝对防备多次实例化,纵然是面临巨大的序列化或反射进攻的时候。
public enum Singleton3 {
INSTANCE;
public void testSingleton() {
System.out.println("testSingleton");
}
public static void main(String[] args) {
Singleton3.INSTANCE.testSingleton();
}
}
作者:csdn博客 zdp072
