次のようなコードがあります。
public interface BaseDAO{
// marker interface
}
public interface CustomerDAO extends BaseDAO{
public void createCustomer();
public void deleteCustomer();
public Customer getCustomer(int id);
// etc
}
public abstract class DAOFactory {
public BaseDAO getCustomerDAO();
public static DAOFactory getInstance(){
if(system.getProperty("allowtest").equals("yes")) {
return new TestDAOFactory();
}
else return new ProdDAOFactory();
}
public class TestDAOFactory extends DAOFactory{
public BaseDAO getCustomerDAO() {
return new TestCustomerDAO(); // this is a concrete implementation
//that extends CustomerDAO
//and this implementation has dummy code on methods
}
public class ProdDAOFactory extends DAOFactory {
public BaseDAO getCustomerDAO() {
return new ProdCustomerDAO(); // this implementation would have
// code that would connect to the database and do some stuff..
}
}
さて、私はこのコードがにおいがすることを知っています..多くの理由があります。ただし、このコードもここにあります: http://java.sun.com/blueprints/corej2eeppatterns/Patterns/DataAccessObject.html、9.8 を参照
私がやろうとしているのはこれです:1)環境(システムプロパティ)に基づいて実行時にDAOの実装を切り替えます。2) 型キャストを回避できるように、Java ジェネリックを使用します...たとえば、次のようなことを行います。
CustomerDAO dao = factory.getCustomerDAO();
dao.getCustomer();
とは対照的に:
CustomerDAO dao = (CustomerDAO) factory.getCustomerDAO();
dao.getCustomer();
あなたの考えや提案をお願いします。