我想到了一个简单的问题: 我有我的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的客户端,这两种实现没有区别。
答案 0 :(得分:3)
基本上,如果您的DAO类是不可变的,或者是无状态的,那么您可以这样做,但如果它们不是,则必须使DAO类线程安全,如果多个线程访问同一个对象并弄乱其状态,它可以创建故障。
(在单线程环境中,您编写的内容是可以接受的,但是当您编写DAO模式时,我确定它不是单线程的)
那么为什么我们不这样做,为什么不一样呢:线程安全成为一个问题。
答案 1 :(得分:1)
如果我调用方法create()
,我期望它来创建新版本。或许更直观的方法是调用你的方法getInstance()
,这不会做出这样的承诺。
答案 2 :(得分:0)
嗯,这取决于DAO是否具有非全局状态。如果他们这样做,则不建议使用单身人士。
除此之外,您在第二种方法中访问工厂时创建了所有DAO。如果您使用它,请使用一些延迟初始化,例如双重检查锁定。
要记住的另一点:如果你不需要DAO(我猜不是这种情况),如果你总是返回一个新实例,它们可能会被垃圾收集。
答案 3 :(得分:0)
这两种实现之间存在很大差异。第二个使用状态变量,这意味着我们可以(或不能)在并发环境中遇到一些问题。实际上,这取决于特定的DAO实现(使用状态或不使用)。
我更喜欢第一个版本,因为它遵循模式工厂的想法。工厂生产的东西,而不是拿东西和按需回收产品。 Factory模式的另一个词是虚拟构造函数,因此所有人都可能期望构造函数返回新实例。