Java Singleton的3种实现方式
1、通过静态成员字段来实例化
public class Elvis { /** * 通过final的静态成员字段来调用私有的构造函数实例化对象 */ public static final Elvis INSTANCE = new Elvis(); /** * 私有构造函数,防止在类以外被实例化 */ private Elvis() { } public void leaveTheBuilding() { System.out.println("Leave the building..."); } public static void main(String[] args) { Elvis.INSTANCE.leaveTheBuilding(); } }
2、通过公有的静态工厂方法
public class Elvis { /** * 把静态成员字段设置为私有的 */ private static final Elvis INSTANCE = new Elvis(); /** * 私有构造函数,防止在类以外被实例化 */ private Elvis() { } /** * 通过公有的静态工厂方法导出Single实例 * @return Singleton实例 */ public Elvis getInstance(){ return INSTANCE; } public void leaveTheBuilding() { System.out.println("Leave the building..."); } public static void main(String[] args) { Elvis.INSTANCE.leaveTheBuilding(); } }
3、通过枚举来返回,这种方式更加简洁,无偿提供了序列化机制,绝对防止多次实例化,即使在面对多次序列化和范序列化攻击的时候。虽然这种方法没有被广泛采用,但这种方式已经成为实现Singleton的最佳方法。
public class Elvis { /** * 把静态成员字段设置为私有的 */ private static final Elvis INSTANCE = new Elvis(); /** * 私有构造函数,防止在类以外被实例化 */ private Elvis() { } /** * 通过包含单个元素的枚举类型来实现,推荐的方式(从Java 1.5 发行版起) */ public enum Elvis1 { INSTANCE; public void leaveTheBuilding() { System.out.println("Leave the building..."); } } public static void main(String[] args) { Elvis1.INSTANCE.leaveTheBuilding(); } }