服务和DAO设计模式

时间:2012-08-26 08:37:00

标签: design-patterns java-ee

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

现在我们怀疑服务是否说例如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();

    }


}

哪种方法更好,在哪种情况下?

1 个答案:

答案 0 :(得分:1)

我认为第一个更好(即属性),因为它更容易管理它们。代码也将更加清晰,而不是以不同的方法调用Factory,或者在每个方法中都有一个dao变量。您可以轻松修改Daos以便以后使用,而无需在多个区域进行替换。如果您决定在那里初始化Dao,或者创建一个要使用的自定义dao,或者稍后使用依赖注入,那么您不必重新访问对DaoFactory的所有调用。

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

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