我想创建一个返回dao-instance的Factory,具体取决于Class clazz
团队成员,场景和设备是我的模型类。
我的DAO看起来像这样:
public class JDBCTeammemberDAO implements JdbcDAO<Teammember>
我的工厂看起来像这样:
public class DAOFactory {
JdbcDAO createDAO(Class clazz) {
if(clazz.equals(Teammember.class)) {
return new JDBCTeammemberDAO();
}
if(clazz.equals(Scene.class)) {
return new JDBCSceneDAO();
}
if(clazz.equals(Equipment.class)) {
return new JDBCEquipmentDAO();
}
return null;
}
}
我在考虑切换和多态,但我无法弄清楚如何。
基本上我想找到实现“SomeClass实现JdbcDAO”
我的第一个方法是:
String name = clazz.getName().substring(6); // model.Teammember
Class<?> forName;
try {
forName = Class.forName("dao.jdbc.JDBC" + name + "DAO");
return (JdbcDAO) forName.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
但是我对使用String方法处理它感觉不舒服。此外,如果我有不同的Model和Dao名称(例如:JDBCMemberDAO而不是JDBCTeammemberDAO),它不起作用
答案 0 :(得分:1)
Sormula按照你的描述工作。它提供了一种获取行/记录类的“DAO”的方法。请参阅example 1中的database.getTable(Inventory.class);
。你不需要写任何DAO。
答案 1 :(得分:1)
我处于类似的情况,并决定使用Dao注册表来处理这个问题。使用提到的泛型dao模式@Perception:
public interface JdbcDAO<T> {
T find(Long id) ;
T create(T entity);
T update(T entity);
void delete(T entity);
}
public class JdbcDAOImpl<T> {
this.clazz = clazz;
DaoRegistry.register (clazz, this);
}
然后你可以拥有你的
public class JDBCTeammemberDAO extend JdbcDAOImpl<TeamMember> {
public class JDBCTeammemberDAO () {
super(TeamMember.class);
}
}
DaoRegistry看起来像这样:
public class DaoRegistry {
private Map<Class, JdbcDAO> daoMap;
public synchronized void register (Class type, JdbcDao dao) {
if (!daoMap.containsKey(type))
daoMap.put (type, dao);
else
logger.error ("Something is really wrong because you are creating another dao for this class.", e);
}
public JdbcDAO get(Class type) {return daoMap.get(type);
}
这只是它的开玩笑,你需要确保它是线程安全的。希望这会有所帮助。
答案 2 :(得分:0)
如果你不介意进行轻微的重新设计,这个问题很容易通过一些泛型和多态来解决:
public interface JdbcDAO<T> {
T find(Long id) ;
T create(T entity);
T update(T entity);
void delete(T entity);
// Other common definitions
}
public class JdbcDAOImpl<T> {
private Class<T> clazz;
public JdbcDAOImpl() {
super();
}
protected JdbcDAOImpl(Class<T> clazz) {
super();
this.clazz = clazz;
}
// Common implementation here
}
public class EquipmentDAO extends JdbcDAOImpl<Equipment> {
public EquipmentDAO() {
super(Equipment.class);
}
// Subclass specific implementation here
}
冲洗并重复每个模型的特定impl并直接实例化(不使用工厂)。