Java单例模式,看这一篇就够了( 三 )


不能通过 reflection attack 来调用私有构造方法 。
public enum Singleton {INSTANCE;public void whateverMethod() {}}7. 登记式如果熟悉我们封装的工具包Toolbox,就会知道工具包内提供了一个登记式单例工具类Singleton 。
单例模式是一种非常常用的设计模式,但以上介绍的各种方法,都需要为每个单例类编写一些模板式的代码,为了简化,我们可以使用Singleton工具类 。
//获取单例对象//Student类必须要具备无参构造方法//每个类在一个进程中只能获得一个单例对象Student student = Singleton.get(Student.class);//移除单例对象Singleton.remove(Student.class);//清空所有单例对象Singleton.clear();//单例对象数量int size = Singleton.size();其实他就是很像是spring容器 。
Singleton.java:
/** * 单例工具 * @author Unicorn */public final class Singleton {/*** 对象池*/private static Map<String, Object> pool = new ConcurrentHashMap();private Singleton() {}public static <T> T get(Class<T> clazz) {Assert.notNull(clazz);String key = clazz.getName();T obj = (T) pool.get(key);if (null == obj) {synchronized(Singleton.class) {obj = (T) pool.get(key);if (null == obj) {obj = ReflectUtil.newInstance(clazz);pool.put(key, obj);}}}return obj;}/*** 移除对象* @param clazz*/public static void remove(Class clazz) {if (null != clazz) {String key = clazz.getName();pool.remove(key);}}/*** 销毁,清空对象池*/public static void clear() {pool.clear();}public static int size() {return pool.size();}}8. Spring容器spring容器核心机制是IoC和DI,其本身也提供了单例对象的支持 。

经验总结扩展阅读