2

我对 Delegate-Service 和 DAO 设计模式有疑问。我们的团队认为我们将为 DAOFactory 和 DAO 对象使用单例模式。DAOFactory 将包含所有可用的 DAO 作为其属性,并在需要时提供它们。

现在我们有一个疑问,Service 说,例如 AuthenticateSerivce 是否应该包含所有必需的 DAO,例如 UserDAO、RoleDAO 等作为属性?或者它应该根据需要调用 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 的所有调用。

第二个问题是关于在 DAO 中使用单例。我不确定每个 DaoImpl 是如何完成的,但是当服务被多个线程访问时(同样,这取决于你如何实现你的 Daos)并且它们共享同一个 Dao,就有可能出现线程问题。或者,也许您想使用一个为每个请求实例化一个新 Dao 的工厂?但如果是这种情况,那么我相信你会选择第一个选项,因为你不想在每个方法中重新创建一个 dao。

Daos 的创建成本可能很低(假设您的团队担心性能问题),因此它们不需要按需实例化,但您应该进行一些连接或资源池(例如,重用 Db 连接)。

于 2012-08-26T09:40:59.067 回答