DAOFactory:返回一个新实例或始终相同?

时间:2012-09-07 14:04:12

标签: java design-patterns dao factory-pattern

我想到了一个简单的问题: 我有我的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的客户端,这两种实现没有区别。

4 个答案:

答案 0 :(得分:3)

基本上,如果您的DAO类是不可变的,或者是无状态的,那么您可以这样做,但如果它们不是,则必须使DAO类线程安全,如果多个线程访问同一个对象并弄乱其状态,它可以创建故障。

(在单线程环境中,您编写的内容是可以接受的,但是当您编写DAO模式时,我确定它不是单线程的)

那么为什么我们不这样做,为什么不一样呢:线程安全成为一个问题。

答案 1 :(得分:1)

如果我调用方法create(),我期望它来创建新版本。或许更直观的方法是调用你的方法getInstance(),这不会做出这样的承诺。

答案 2 :(得分:0)

嗯,这取决于DAO是否具有非全局状态。如果他们这样做,则不建议使用单身人士。

除此之外,您在第二种方法中访问工厂时创建了所有DAO。如果您使用它,请使用一些延迟初始化,例如双重检查锁定。

要记住的另一点:如果你不需要DAO(我猜不是这种情况),如果你总是返回一个新实例,它们可能会被垃圾收集。

答案 3 :(得分:0)

这两种实现之间存在很大差异。第二个使用状态变量,这意味着我们可以(或不能)在并发环境中遇到一些问题。实际上,这取决于特定的DAO实现(使用状态或不使用)。

我更喜欢第一个版本,因为它遵循模式工厂的想法。工厂生产的东西,而不是拿东西和按需回收产品。 Factory模式的另一个词是虚拟构造函数,因此所有人都可能期望构造函数返回新实例。