一、创建对象池的目的
设计一个对象池,能够加载配置文件中的所有对象放到池子中,这样外界就可以不需要使用new关键字来创造对象,只需从对象池中获取即可,简化编程。
二、对象池的创建
1 将需要获取的对象的类的信息写入配置文件,如下所示:
Student=com.qqq.reflectdemo02.Student
Teacher=com.qqq.reflectdemo02.Teacher
Dog=com.qqq.reflectdemo02.Dog
2 设计一个工厂类,提供获取对象的方法,如下所示
class InstancePoolFactory {
// 创建一个容器【集合或数组】,用于保存对象及与对象相关的主键值
private static Map<String, Object> instancePool = new HashMap<>();
//创建一个保存配置文件路径的常量
public static final String DEFAULT_PROP_FILENAME = "config/classinfo.properties";
// 构造方法私有
private InstancePoolFactory() {
}
/*
* 外界获取工厂类的对象的方法
*/
public static InstancePoolFactory getInstance() {
return new InstancePoolFactory();
}
/*
* 动态创建对象的方法
*/
// 通过类名获取对象
public static Object createObject(String className) throws Exception {
Class<?> c = Class.forName(className);
return c.getConstructor().newInstance();
}
// 通过字节码文件对象获取对象
public static <T> T createObject(Class<T> c) throws Exception {
T t = c.newInstance();
return t;
}
// 通过静态代码块加载配置文件,并将对象保存到集合中
static {
Properties prop = new Properties();
try {
prop.load(new FileReader(DEFAULT_PROP_FILENAME));
Set<String> keys = prop.stringPropertyNames();
for (String className : keys) {
String classPath = prop.getProperty(className);
Object instance = createObject(classPath);
instancePool.put(className, instance);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 通过对象池获取对象
public Object getObject(String name) {
return instancePool.get(name);
}
}
三、获取对象
public class ReflectDemo03 {
public static void main(String[] args) throws Exception {
// 获取工厂类对象
InstancePoolFactory factory = InstancePoolFactory.getInstance();
Object obj = factory.getObject("Teacher");
System.out.println(obj);
}
}