[code="java"]CategoryDao dao = new CategoryDaoImpl();[/code]很好理解
但是下面代码我几有点迷惑了
[code="java"]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);
}
}
}[/code]
不用泛型
[code="java"]
public CategoryDao createCategoryDao(String classname){
try {
CategoryDao dao = (CategoryDao) Class.forName(classname).newInstance();
return dao;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
[/code]
得到实例
[code="java"]
CategoryDao dao = DaoFactory.getinstance().createDao("cn.dao.impl.CategoryDaoImpl",CategoryDao.class);
//CategoryDao dao = DaoFactory.getinstance().createDao("cn.dao.impl.CategoryDaoImpl");
[/code]
很明显Class.forName(classname).newInstance()得到是接口实现类为什么还需要强转
想了很久[code="java"]CategoryDao dao = new CategoryDaoImpl();[/code]两个感觉矛盾了 :cry: .
求解... :oops:
动作还是慢了,为了确保能拿到这分,其实你的DaoFactory可以再完善一点
[code="java"]
public class DaoFactory {
private DaoFactory(){}
private static DaoFactory instance = new DaoFactory();
public static DaoFactory getinstance(){
return instance;
}
public <T> T createDao(Class<T> clazz){
try {
return (T) Class.forName(clazz.getName).newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
[/code]
我个人认为这个可以从java的面向接口编程的角度来考虑,不用关心具体的实现代码,甚至于内部的实现如何变化都是没有关系的,降低耦合,这样的话会不会更容易理解呢。
从实现的角度都是可以,但是从程序结构的设计角度来讲的话。这种接口编程更灵活,更符合显示的一些概念。 :)
因为java api的clazz.newInstance()返回的是一个泛型,在没有指定时,就是一个Object对象。
[quote]Class.forName(classname).newInstance()[/quote]
其实你把这个的结果输出一下 你就看的很明白了!
通过反射创建不同对象类型没法区分。 所有对象都属于Object子类。所以返回OBJECT对象。