2012-01-20 19 views
1

クラスclazzに応じてdao-instanceを返すファクトリを作成したいクラスパラメータを使ってdaoを因数分解する方法

チームメンバー、シーンと設備は私のモデルクラスです。

私のDAOの次のようになります。

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; 

    } 
} 

私はスイッチおよび多型を考えていたが、私は方法を見つけ出すことができませんでした:

public class JDBCTeammemberDAO implements JdbcDAO<Teammember> 

私の工場はこのようになります。

基本的に私は、インプリメンテーションを見つけたい「工assが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(); 
} 

が、私は文字列の方法でこれを処理して良い感じはありません。また、モデルとDAOの名前が異なる場合(JDBCTeamemberDAOの代わりにJDBCMemberDAO)、

答えて

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

あなたが記述した通りに動作します。行/レコードクラスの "DAO"を取得するメソッドを提供します。 をexample 1に記載してください。 DAOを書く必要はありません。

関連する問題