2011-07-08 7 views
0

Userクラスと2つのサブクラスEmployeeCustomerがあるとします。私はDBの階層ごとのテーブルとしてこの階層を実装し、ユーザのタイプを指定するカラムを持っていました。私はこのテーブルを照会するときに正しいタイプのオブジェクトを返す必要があります。階層あたりの表の構造体のDAOの取得

は私がCustomerDAOまたはEmployeeDAOのようなオブジェクトの種類ごとに別々のDAOが必要ですので、それぞれが、それぞれのCustomerEmployeeオブジェクトを返します。もしそうであれば使用しなくてもDAOFactoryからそれらを取得する方法:

if(type.equlas('customer')) 
    return customerDao; 
else 
    retrun employeeDao; 

Userを実装するタイプが変更される可能性があり、私は条件を毎回変更したくないので。

他の方法がありますか?任意のアイデアをいただければ幸いです。

注:私はORMフレームワークを使用しておらず、使用する予定もありません。

+0

あなたのクラス階層についてもう少し言うことはできますか? EmployeeはUserのサブクラスですか、あるいは2つのエンティティ間にリンケージがありますか?また、あなたのDAOからどのような参照タイプが返ってくると思いますか? – jtoberon

+0

@jtoberonはい従業員と顧客はユーザーのタイプです。私が持っているのはユーザーIDだけです。これらのIDに基づいて、私は同じテーブルを照会し、ユーザーがタイプcustomerの場合は「Customer」を、タイプが従業員の場合は「Employee」を取得する必要があります。 – doctrey

答えて

0

各タイプのパーシスタンスコードが同じ場合、1つの汎用DAOを持つことができます。

だからあなたのユーザーDAO、のようなものが考えられます。

interface DAO<T, ID> { 
    T create(T t); 
    T read(ID id); 
    T update(T t); 
    void delete(T t); 
} 

class UserDAO<T extends User> implements DAO<T> { 
    // Your methods for crud operations will be limited to types of User. 
} 

その後、あなたのファクトリクラスは、単に正しい型を指定することで、正しいDAOをインスタンス化できます。

class DAOFactory { 
    public UserDAO<Employee> getEmployeeDAO() { 
    return new UserDAO<Employee>(); 
    } 
} 

よろしく
ユスフ

+0

各DAOのコードは同じではありません。それぞれはそれぞれのオブジェクトデータを満たす必要があります。この方法では、必要なDAOを取得するために 'if ... else'でオブジェクトの型をチェックする必要があります。 – doctrey

+0

あなたの工場にそれぞれのタイプのメソッドがある場合、チェックの必要はありません...? ifステートメントは、返されるDAOが汎用であることを意味します。それは事実ですか? –

+0

多分私はここで何かを逃しているが、DAO工場で正しい方法を呼び出すために、私が必要とするDAOの種類を知る必要はない。とにかくお返事いただきありがとうございます。私は、問題を複数のDAOの必要性を排除する別の方法で解決しようとしました。次回同様の問題に直面したら、私はリフレクションを試してみたいと思う。 – doctrey