2

Delegate-Service と DAO の設計パターンには疑問があります。私たちのチームは、DAOFactory と DAO オブジェクトにシングルトン パターンを使用すると考えました。DAOFactory は、利用可能なすべての DAO をその属性として含み、必要なときにそれらを提供します。

ここで、AuthenticateSerivce などの Service に必要なすべての DAO (UserDAO、RoleDAO など) を属性として含める必要があるかどうかについて、1 つの疑問があります。または必要に応じて get**DAO() を呼び出す必要があり、独自の属性として設定する必要はありません (添付の Java ファイル)。

コードスニペット:

public class AuthenticateService {
    UserDao userDao;
    RoleDao roleDao;

    public AuthenticateService(){
        DaoFactory daoFactory = DaoFactory.getInstance();
        userDao = daoFactory.getUserDao();
        roleDao = daoFactory.getRoleDao();
    }


}


public class DaoFactory {

    private static DaoFactory instance = null;

    UserDao userDao;
    RoleDao roleDao;
    AnnualScheduleDao annualScheduleDao;
    WeeklyScheduleDao weeklyScheduleDao;
    ProgramSlotDao programSlotDao;

    private DaoFactory (){
        // Authenticate
        userDao = new UserDaoImpl();
        roleDao = new RoleDaoImpl();

        // Schedule
        annualScheduleDao = new AnnualScheduleDaoImpl();
        weeklyScheduleDao = new WeeklyScheduleDaoImpl();
        programSlotDao = new ProgramSlotDaoImpl();

    }


}

どのアプローチが優れており、どのような状況で使用されますか?

4

1 に答える 1

1

最初の方が管理しやすいので、最初の方が優れていると思います(つまり、属性)。異なるメソッドでFactoryを呼び出したり、各メソッドでdao変数を使用したりするのではなく、コードもよりクリーンになります。いくつかの領域で交換することなく、後で使用するためにDaosを簡単に変更できます。そこでDaoを初期化するか、使用するカスタムdaoを作成するか、後で依存性注入を使用することにした場合は、DaoFactoryへのすべての呼び出しを再検討する必要はありません。

2番目の問題は、DAOでのシングルトンの使用に関するものです。各DaoImplがどのように実行されているかはわかりませんが、サービスが複数のスレッドによってアクセスされ(ここでも、Daosの実装方法によって異なります)、それらが同じDaoを共有している場合、スレッドの問題が発生する可能性があります。または、リクエストごとに新しいDaoをインスタンス化するファクトリを使用したいですか?ただし、その場合は、各メソッドでdaoを再作成したくないので、最初のオプションを選択すると確信しています。

Daosは作成が安価である可能性が高いため(チームがパフォーマンスの問題を心配していると仮定)、オンデマンドでインスタンス化する必要はありませんが、接続またはリソースプーリング(Db接続の再利用など)を行う必要があります。

于 2012-08-26T09:40:59.067 に答える