如何用类参数对dao进行因子分析

时间:2012-01-20 14:56:20

标签: java class reflection factory

我想创建一个返回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),它不起作用

3 个答案:

答案 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并直接实例化(不使用工厂)。