package com.github.looly.hutool; import java.util.HashMap; import java.util.Map; import com.github.looly.hutool.exceptions.UtilException; /** * 单例类<br> * 提供单例对象的统一管理,当调用get方法时,如果对象池中存在此对象,返回此对象,否则创建新对象返回 * @author loolly * */ public final class Singleton { private static Map<Class<?>, Object> pool = new HashMap<Class<?>, Object>(); private Singleton() {} /** * 获得指定类的单例对象<br> * 对象存在于池中返回,否则创建,每次调用此方法获得的对象为同一个对象<br> * 创建对象时调用其默认的无参构造方法,如果对象无此构造方法,会创建失败。 * @param clazz 类 * @return 单例对象 */ @SuppressWarnings("unchecked") synchronized public static <T> T get(Class<?> clazz) { T obj = (T) pool.get(clazz); if(null == obj) { obj = ClassUtil.newInstance(clazz); pool.put(clazz, obj); } return obj; } /** * 获得指定类的单例对象<br> * 对象存在于池中返回,否则创建,每次调用此方法获得的对象为同一个对象<br> * 创建对象时调用其默认的无参构造方法,如果对象无此构造方法,会创建失败。 * @param className 类名 * @return 单例对象 */ public static <T> T get(String className) { Class<?> clazz = null; try { clazz = Class.forName(className); } catch (ClassNotFoundException e) { throw new UtilException(e); } return get(clazz); } /** * 移除指定Singleton对象 * @param clazz 类 */ synchronized public static void remove(Class<?> clazz) { pool.remove(clazz); } /** * 清除所有Singleton对象 */ synchronized public static void destroy() { pool.clear(); } }