2

私の頭に浮かんだ簡単な質問: DAOFactory クラスがあります。

public class DAOFactory {
    public static UserDAO createUserDAO() {
        return new UserDAO();
    }

    public static AdminDAO createUserDAO() {
        return new AdminDAO();
    }
    //etc etc
}

この方法 (AFAIK は標準です) を行うと、誰かが DAO を要求するたびに、新しいインスタンスが作成されます。実際、何か不足していない限り、DAO ごとに複数のインスタンスを用意する必要はありません。:D

では、このようにしてみませんか?

public class DAOFactory {
    /* eventually we could use lazy initialization */
    private static UserDAO userDAO = new UserDAO();
    private static UserDAO AdminDAO = new AdminDAO();
    //etc etc
    public static UserDAO createUserDAO() {
        return userDAO;
    }

    public static AdminDAO createUserDAO() {
        return adminDAO;
    }
    //etc etc
}

パフォーマンスとメモリの観点から言えば、前者と後者の違いは何ですか? 実際には、DAOFactory のクライアントに対するこれら 2 つの実装に違いはないと思います。

4

4 に答える 4

3

基本的に、DAO クラスが不変またはステートレスである場合は実行できますが、そうでない場合は、DAO クラスをスレッド セーフにする必要があります。複数のスレッドが同じオブジェクトにアクセスし、その状態を混乱させると、エラーが発生する可能性があります。

(シングルスレッド環境では、あなたが書いたものは受け入れられますが、DAO パターンを書いているときは、シングルスレッドではないと確信しています)

では、なぜそれを行わないのか、なぜ同じではないのか: スレッドの安全性が問題になります。

于 2012-09-07T14:16:42.760 に答える
1

create()methodを呼び出すと、新しいバージョンが作成されることが期待されます。おそらく、あなたのメソッドを呼び出す方がより直感的getInstance()ですが、そのような約束はありません。

于 2012-09-07T14:12:53.337 に答える
0

これら 2 つの実装には多くの違いがあります。2 つ目は状態変数を使用します。これは、同時実行環境で問題が発生する可能性がある (または発生しない) ことを意味します。実際、これは特定の DAO 実装 (状態を使用するかどうか) に依存します。

パターンファクトリーの考え方に従っているので、私は最初のバージョンを好みます。工場は、何かを保持して要求に応じて製品を返すのではなく、何かを生産します。ファクトリ パターンの別の言葉は仮想コンストラクターです。そのため、すべてのコンストラクターが新しいインスタンスを返すことを期待するかもしれません。

于 2012-09-07T14:15:31.957 に答える
0

これは、DAO が非グローバル状態であるかどうかによって異なります。その場合、シングルトンの使用はお勧めできません。

それに加えて、2 番目の方法でファクトリにアクセスするときに、すべての DAO を作成しています。これを使用する場合は、ダブル チェック ロックなどの遅延初期化を使用してください。

心に留めておくべきもう 1 つのポイント: DAO をあまり必要としない場合 (ここではそうではないと思います)、常に新しいインスタンスを返すと、ガベージ コレクションが行われる可能性があります。

于 2012-09-07T14:11:28.343 に答える