CategoryDao dao = new CategoryDaoImpl();很好理解但是下面代码我几有点迷惑了
package cn.factory;import cn.dao.CategoryDao;
import cn.dao.impl.CategoryDaoImpl;
import cn.domain.Category;public class DaoFactory {
private DaoFactory(){}
private static DaoFactory instance = new DaoFactory();
public static DaoFactory getinstance(){
return instance;
}
public <T> T createDao(String classname,Class<T> clazz){
try {
T t = (T) Class.forName(classname).newInstance();
return t;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}不用泛型public CategoryDao createCategoryDao(String classname){
try {
CategoryDao dao = (CategoryDao) Class.forName(classname).newInstance();
return dao;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
得到实例CategoryDao dao = DaoFactory.getinstance().createDao("cn.dao.impl.CategoryDaoImpl",CategoryDao.class);
//CategoryDao dao = DaoFactory.getinstance().createDao("cn.dao.impl.CategoryDaoImpl");
很明显Class.forName(classname).newInstance()得到是接口实现类为什么还需要强转想了很久CategoryDao dao = new CategoryDaoImpl();两个感觉视乎矛盾了 难道是反射机制问题 :cry: .
求解... :oops:
package cn.factory;import cn.dao.CategoryDao;
import cn.dao.impl.CategoryDaoImpl;
import cn.domain.Category;public class DaoFactory {
private DaoFactory(){}
private static DaoFactory instance = new DaoFactory();
public static DaoFactory getinstance(){
return instance;
}
public <T> T createDao(String classname,Class<T> clazz){
try {
T t = (T) Class.forName(classname).newInstance();
return t;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}不用泛型public CategoryDao createCategoryDao(String classname){
try {
CategoryDao dao = (CategoryDao) Class.forName(classname).newInstance();
return dao;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
得到实例CategoryDao dao = DaoFactory.getinstance().createDao("cn.dao.impl.CategoryDaoImpl",CategoryDao.class);
//CategoryDao dao = DaoFactory.getinstance().createDao("cn.dao.impl.CategoryDaoImpl");
很明显Class.forName(classname).newInstance()得到是接口实现类为什么还需要强转想了很久CategoryDao dao = new CategoryDaoImpl();两个感觉视乎矛盾了 难道是反射机制问题 :cry: .
求解... :oops:
CategoryDao dao = new CategoryDaoImpl();那你为什么这样,为什么不这样写CategoryDaoImpl dao = new CategoryDaoImpl();面向接口编程的好处。或者说如果你下次
Class.forName(classname).newInstance()得到是另一个CategoryDao接口实现类,那你不是要改代码。
个人见解,仅供参考!
try {
CategoryDao x = cl.newInstance();
return x;
} catch (Exception e) {
throw new RuntimeException(e);
}
},调用的时候用:CategoryDao a = create(CategoryDaoImpl.class);就可以了
Class.forName(classname).newInstance();
这句话没有带任何类型进去,所以不可能出来一个不需要转型的
你知道不一定代表计算机知道。强转就是把你知道的告诉计算机
= =classname只是一个字符串 这样是为了降低解耦度0 0,
基于hibernate持久层的 cn.dao.impl.categoryDaoHibernateImpl
基于ibatis持久层的 cn.dao.impl.categoryDaoIbatisImpl
基于JDBC的cn.dao.impl.categoryDaoJdbcImpl以上三个类型字符串 都可以替换以下的字符串 xxxx
CategoryDao dao = (CategoryDao) Class.forName(xxxxx).newInstance();这样一来,灵活性就很大,我可以随时更换DAO层的实现技术,而代码需要改变的地方就是xxxx这里。