思路:将要创建的对象和创建对象所需的类存放在properties文件中,通过将properties文件读取出来,将对象和创建对象所需的类以键值对的方式存在HashMap中,实现对象工厂的模拟。
1.创建properties文件,并存入对象和创建对象所需的类
accountService=com.jingsheng.service.impl.AccountServiceImpl
accountDao=com.jingsheng.dao.impl.AccountDaoImpl
2.模拟对象工厂,创建BeanFactory类
//1.创建properties对象
private static Properties props;
//2.定义一个Map,用于存放创建的对象和所需的类,称为容器
private static Map<String,Object> beans;
//3.在静态代码块中将properties中的值取出,存在Map中
static{
try{
//实例化对象
props = new Properties();
//获取Properties文件的流对象
InputStream in = BeanFactory.class.getClassLoader.getResourceAsStream("bean.properties");
props.load(in);
//实例化容器
beans = new HashMap<String, Object>();
//取出配置文件所有的key
Enumeration keys = props.keys();
//遍历枚举
while (keys.hasMoreElements()){
//取出每个key
String key = keys.nextElement().toString();
//根据key获取value
String beanPath = props.getProperty(key);
//反射创建对象
Object value = Class.forName(beanPath).newInstance();
//把key和value存入容器
beans.put(key,value);
}
} catch (Exception e) {
throw new ExceptionInInitializerError("初始化properties失败");
}
}
//用于从Map中通过key取出对象
public static Object getBean(String beanName){
return beans.get(beanName);
}
}
创建业务层接口IAccountService,接口定义方法,业务层AccountServiceImpl实现接口的方法,测试对象是否能够执行方法
public void saveAccount() {
System.out.println("保存了账户");
}
创建一个测试类,测试从中取出对象
public class test{
public static void main(String[] args){
IAccountService as = (IAccountService)BeanFactory.getBean("accountService");
as.saveAccount();
}
}
方法执行成功说明对象工厂模拟成功。