一、配景
所谓的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