2011-11-16 9 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を使用して行くべきかについて混乱していますか?現時点では、私はファクトリーメソッドが過剰であると思います。破壊、clazzとして

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

は動的である、それは引数を受け入れるようにファクトリメソッドを変更しようとしている悪夢を証明されている可能性がありますので、代わりに、それはそうのように、単純にクライアントからDAOを構築するために、より理にかなっています途中で私の汎用インターフェース。

クリーンな方法はありますか? 、私は単にBasicDAO<T, K>提供morphiaを拡張している可能性が、これは私が簡単にJDBC MongoDBのからに変更することはできなかっただろうなど

答えて

2

私はあなたが春やGuiceのを見てお勧めします。これはDependency Injectionと呼ばれているため、クライアントは依存関係の検索/インスタンス化を実行する責任がありません。これらのコンテナは「ビーンズ」を作成し、クライアントオブジェクトがDAOを取得する場所や使用する実装について心配する必要がないように、「クライアント」オブジェクトに必要なものを注入します。

DIワールドでは、異なる実装のためにBeanの作成方法が異なるだけで害はありません。これらの「汚れた」ものは集中管理されています(例:Springの場合はApp Context config)。

+0

私のアプローチはうまくいっていると言っています(_factoryメソッドはありません、具体的な実装クラスをクライアントコードで定義するのではなく、_Guice_のようなものを使用する必要があります)。 – wulfgarpro

関連する問題