我有如下代码:
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/corej2eepatterns/Patterns/DataAccessObject.html,请参阅9.8
我打算做的是这样的:
1)在运行时根据环境(系统属性)切换我的DAO实现。
2)利用Java泛型,以便避免类型转换...
例如,执行以下操作:
CustomerDAO dao = factory.getCustomerDAO();
dao.getCustomer();
相对于:
CustomerDAO dao = (CustomerDAO) factory.getCustomerDAO();
dao.getCustomer();
请提出您的想法和建议。
最佳答案
您应该这样定义工厂:
public abstract class DAOFactory<DAO extends BaseDAO> {
public DAO getCustomerDAO();
public static <DAO extends BaseDAO> DAOFactory<DAO> getInstance(Class<DAO> typeToken){
// instantiate the the proper factory by using the typeToken.
if(system.getProperty("allowtest").equals("yes")) {
return new TestDAOFactory();
}
else return new ProdDAOFactory();
}
getInstance应该返回正确类型的DAOFactory。
工厂变量的类型为:
DAOFactory<CustomerDAO> factory = DAOFactory<CustomerDAO>.getInstance(CustomerDAO.class);
并将正确键入用法:
CustomerDAO dao = factory.getCustomerDAO();
dao.getCustomer();
唯一的问题可能是getInstance方法内部需要进行强制转换。