泛型化单例模式,关键点为Class.newInstance(),构建无参的Class类的实例。写个例子记录一下(MyEclipse maven):
src/main/java源文件夹下:
club.younge.demo下新建单例获取类和实体类(Singleton, Student)
Singleton:
package club.younge.demo;
import java.util.concurrent.ConcurrentHashMap;
/**
* 泛型化单例模式
*
* @author Younge
*
*/
public class Singleton {
@SuppressWarnings("rawtypes")
private static final ConcurrentHashMap<Class, Object> MAP = new ConcurrentHashMap<Class, Object>();
@SuppressWarnings("unchecked")
public static <T> T getInstance(Class<T> type) {
Object object = MAP.get(type);
if (object == null) {
try {
synchronized (MAP) {
object = type.newInstance(); //关键部分,通过类型创建无参实例
MAP.put(type, object);
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return (T) object;
}
public static <T> void remove(Class<T> type){
MAP.remove(type);
}
}
Student:
package club.younge.demo;
public class Student {
private String number;
private String name;
public String getNumber() {
return number;
}
public void setNumberAndName(String number, String name){
this.number = number;
this.name = name;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return new StringBuilder()
.append("I am a student, my number is ")
.append(this.number).append(",my name is ")
.append(this.name).toString();
}
}
src/test/java源文件夹下:
club.younge.demo下新建测试类(TestCC)
TestCC:
package club.younge.demo;
import org.junit.Test;
public class TestCC {
@Test
public void testSingleTon(){
Student student = Singleton.getInstance(Student.class);
student.setNumberAndName("123", "Haha");
System.out.println(student);
}
}
测试结果:
I am a student, my number is 123,my name is Haha