2

我想到了一个简单的问题:我有我的 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

4 回答 4

3

基本上,如果你的 DAO 类是不可变的或无状态的,那么你可以这样做,但如果不是,你必须使 DAO 类线程安全,如果多个线程访问同一个对象并弄乱它的状态,它可能会导致失败。

(在单线程环境下,你写的可以接受,但是当你写DAO模式的时候,肯定不是单线程的)

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

于 2012-09-07T14:16:42.760 回答
1

如果我调用一个方法create(),我希望它会创建一个新版本。也许调用你的方法更直观getInstance(),它没有这样的承诺。

于 2012-09-07T14:12:53.337 回答
0

嗯,这取决于 DAO 是否具有非全局状态。如果是这样,则不建议使用单例。

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

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

于 2012-09-07T14:11:28.343 回答
0

这两种实现之间有很大的不同。第二个使用状态变量,这意味着我们可以(或不能)在并发环境中遇到一些问题。事实上,这取决于具体的 DAO 实现(是否使用状态)。

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

于 2012-09-07T14:15:31.957 回答