2011-11-16 51 views
1

按我的职位here,我有以下DAO层次:如何在没有工厂的情况下调用DAO?

GenericDAO.java

public interface GenericDAO<T, K> { 
    public K insert(T object); 
    public void remove(K objectId); 
    // extensible 
} 

GenericDAOMongoDBImpl.java

public class GenericDAOMongoDBImpl<T, K> extends BasicDAO<T, K> implements GenericDAO<T, K> { 
    public GenericDAOMongoDBImpl(Class<T> entityClass, Mongo mongo, Morphia morphia, String dbName) { 
     super(entityClass, mongo, morphia, dbName); 
    } 

    public K insert(T object) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    public void remove(K objectId) { 
     // TODO Auto-generated method stub 
    } 
} 

ObjectDAO.java

public interface ObjectDAO extends GenericDAO<Object, ObjectId> { 
} 

ObjectDAOMongoDBImpl.java

public class ObjectDAOMongoDBImpl extends GenericDAOMongoDBImpl<Object, ObjectId> implements ObjectDAO { 
    public ObjectDAOMongoDBImpl(Class<Object> entityClass, Mongo mongo, Morphia morphia, String dbName) { 
     super(entityClass, mongo, morphia, dbName); 
    } 
} 

我对我应该如何去使用ObjectDAO混淆?在这个时候,我认为工厂方法是矫枉过正。因此,相反,它更有意义,简单地从客户端构建DAO像这样:

ObjectDAOMongoDBImpl objectDAO = new ObjectDAOMongoDBImpl(clazz, mongo, morphia, dbName); 

由于clazz是动态的,它可能会被证明是一场噩梦试图改变工厂方法接受的说法,打破我的通用接口。

有没有更清洁的方法?我可以简单地扩展提供BasicDAO<T, K>吗啡,但这不会让我轻易改变从MongoDB的JDBC

回答

2

我会建议你看看春天或吉斯。这就是我们所说的依赖注入,因此“客户端”不会负责为它们的依赖项执行查找/实例化。这些容器将创建“bean”并在你的“客户”对象中注入所需的正确对象,这样你的客户对象就不必担心DAO的获取位置或应该使用哪个实现。

而在DI世界中,对于不同的实现来说,为不同的bean创建方法并没有什么坏处。这些“脏”的东西是集中的(例如在Spring的情况下在App Context配置中)。

+0

所以你说我的方法很好(没有_factory method_,我应该只使用_Guice_之类的东西,而不是在客户端代码中定义具体的实现类? – wulfgarpro

相关问题