使用泛型获取单例对象工具类
1、接口定义
public interface Generic<D> {
D getObject(Class<D> d) throws IllegalAccessException, InstantiationException;
}
2、实现接口
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class GenericImpl<D> implements Generic<D>{
private static volatile Map<Class,Object> map = new ConcurrentHashMap<>();
public static Map<Class, Object> getMap() {
return map;
}
private volatile static GenericImpl instance;
private GenericImpl(){
}
/**
* 唯一公开获取实例的方法(静态工厂方法)
*
* @return
*/
public static GenericImpl getUniqueInstance() {
//第一个 if 语句用来避免 instance 已经被实例化之后的加锁操作
if (instance == null) {
// 加锁
synchronized (GenericImpl.class) {
//第二个 if 语句进行了加锁,所以只能有一个线程进入,就不会出现 instance == null 时两个线程同时进行实例化操作。
if (instance == null) {
instance = new GenericImpl();
}
}
}
return instance;
}
@Override
public D getObject(Class<D> c) throws IllegalAccessException, InstantiationException {
synchronized (map){
if (map.containsKey(c)){
return (D) map.get(c);
}else {
D d = c.newInstance();
map.put(c,d);
return d;
}
}
}
}
3、测试类
import java.util.Map;
public class Test {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
GenericImpl testGeneric = GenericImpl.getUniqueInstance();
Test test1 = (Test) testGeneric.getObject(Test.class);
Test test2 = (Test) testGeneric.getObject(Test.class);
System.out.println(test1==test2);//true
Test2.main(args);
Map<Class, Object> map = GenericImpl.getMap();
System.out.println(map);
}
static class Test2{
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
GenericImpl testGeneric = GenericImpl.getUniqueInstance();
Test2 object1 = (Test2)testGeneric.getObject(Test2.class);
Test2 object2 = (Test2)testGeneric.getObject(Test2.class);
System.out.println(object1==object2);//true
}
}
}