最简单的,是将构造器设置为私有,再加入一个公有静态方法,来获得这个实例。
实现第二种方式就是运用静态工厂的方式。优势在于,它提供了灵活性:在不改变API的前提下,我们可以改变该类是否可以为Singleton的想法。public class Elvis{ public static final Elvis INSTANCE = new Elvis(); private Elvis() { } // others methods }
但是这种方式存在缺陷型,如线程的不安全,反序列化时,也会生成新的实例。但线程的不安全可以通过synchronized关键字来解决,反序列化问题可以通过readResolve方法解决。public class Elvis{ private static final Elvis INSTANCE = new Elvis(); private Elvis() { } public static Elvis getINSTANCE() { return INSTANCE; } // others methods }
但这种方式存在一种致命的缺陷,在使用反射机制时,一样的可以生成新的实例。public class Elvis implements Serializable{ private static final long serialVersionUID = 1L; private static final Elvis INSTANCE = new Elvis(); private Elvis() { } public static synchronized Elvis getINSTANCE() { return INSTANCE; } private Object readResolve(){ return INSTANCE; } // others methods }
运行结果返回falseElvis elvis=Elvis.getINSTANCE(); Class<Elvis> cls =Elvis.class; Constructor<Elvis> constructor = cls.getDeclaredConstructor(new Class[]{}); constructor.setAccessible(true); Elvis Anewelvis = constructor.newInstance(new Object[]{}); System.out.println(elvis==Anewelvis?"true":"false");
因此单例模式最好的方法时单元素的枚举法。
public enum Elvis{ INSTANCE; private Elvis(){ } // others methods }
Singleton
最新推荐文章于 2024-02-26 18:00:54 发布