2012-01-20 69 views
1

因素DAO我想創建一個工廠,返回道例如,根據clazz類如何使用類參數

Teammember,場景和裝備是我的模型類。

吾道的是這樣的:

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(); 
} 

,但我不覺得很好用字符串的方法處理這個。另外,如果我有不同的Model和Dao名稱(例如:JDBCMemberDAO,而不是JDBCTeammemberDAO),它不起作用

回答

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); 
} 

這只是它的笑話,您需要確保它是線程安全的。希望這可以幫助。

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並直接實例化它們(不使用工廠)。

+0

但我如何獲得正確的DAO?通過使用'JdbcDAOImpl equipmentDao = new JdbcDAOImpl ()'?我想爲我的服務類建立一個工廠,它不應該關心它得到哪一個。 (特別是如果我想嘲笑它) – MartinL

+0

如果有一個工廠是您的設計的核心,那麼上面的代碼不會幫助你。但是,我也質疑爲什麼你需要特定於模型的DAO。 – Perception

+0

這不是我的核心。我需要一種方法來模擬/存根我的服務類。我們僅在學校與工廠學習 - 如果您有更好的想法,我願意接受您。 – MartinL

1

Sormula按照您的描述工作。它提供了一種獲取行/記錄類的「DAO」的方法。請參閱database.getTable(Inventory.class);example 1。你不需要寫任何DAO。