我怀疑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();
}
}
哪种方法更好,在哪种情况下?
答案 0 :(得分:1)
我认为第一个更好(即属性),因为它更容易管理它们。代码也将更加清晰,而不是以不同的方法调用Factory,或者在每个方法中都有一个dao变量。您可以轻松修改Daos以便以后使用,而无需在多个区域进行替换。如果您决定在那里初始化Dao,或者创建一个要使用的自定义dao,或者稍后使用依赖注入,那么您不必重新访问对DaoFactory的所有调用。
第二个问题是DAO使用单例。我不确定每个DaoImpl是如何完成的,但是当多个线程访问服务时,有可能出现线程问题(同样,这取决于你如何实现你的Daos),并且他们共享相同的Dao。或者你想使用一个工厂来为每个请求实例化一个新的Dao?但如果是这种情况,那么我相信你会选择第一个选项,因为你不想在每个方法中重新创建一个dao。
创建Daos可能很便宜(假设您的团队担心性能问题),因此不需要按需实例化,但您应该进行一些连接或资源池(例如,重用Db连接)。 / p>