什么是DAO工厂模式?

38

我知道工厂方法和抽象工厂方法,但我想在Java中创建一个DAO工厂模式。

  1. 我想知道它的重要性。
  2. 它的用途

我已经查看了此链接,但是对我来说很难理解。

有人能举一个例子解释一下吗?

编辑:以下是我理解的DAO模式的示例:

public interface UserDAO {
    public void insert(User user);
    public void update(User user);
    public void delete(int userId);
}

实现:

public class UserDAOImpl implements UserDAO {
    @Override
    public void delete(int userId) {
        // delete user from user table
    }

    @Override
    public User[] findAll() {
        // get a list of all users from user table
        return null;
    }

    @Override
    public User findByKey(int userId) {
        // get a user information if we supply unique userid
        return null;
    }

    @Override
    public void insert(User user) {
        // insert user into user table
    }

    @Override
    public void update(User user) {
        // update user information in user table
    }
}

工厂模式:

public class UserDAOFactory {
    public static UserDAO getUserDAO(String type) { 
        if (type.equalsIgnoreCase("jdbc")) {
            return new UserDAOImpl();
        } else {
            return new UserDAOImpl();
        }
    }
}

客户端代码:

User user=new User();
user.setName("Jinoy P George");
user.setDesignation("Programmer");
user.setAge(35);
//get a reference to UserDAO object
UserDAO userDAO=UserDAOFactory.getUserDAO("jdbc");
//call insert method by passing user object
userDAO.insert(user);

这个DAO模式正确吗?

我应该在哪里打开连接并关闭它?


5
你的“MammalsFactory”可以创建SQL和Oracle?有趣 ;) - Felix Kling
你已经在 http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html 中的“使用抽象工厂模式”部分检查过示例代码了吗? - joschi
是的,我有,但我无法理解... - coder25
假设您已经有了Databasesqloracle的一些实现,您已经成功地实现了抽象工厂方法模式。您只需要想出如何将sqloracle实现为DAO即可。 - Merlyn Morgan-Graham
你的新实现看起来差不多正确。至于连接,DAO本身可能不应该控制它。工厂或用户应该控制它。这样您就可以在DAO之间共享连接。 - Merlyn Morgan-Graham
2个回答

24

DAO代表“数据访问对象”。它是一个基于接口的类,用于处理特定对象在关系型数据库中的所有CRUD操作。以下是使用泛型的示例:

package persistence;

public interface GenericDao<K extends Serializable, T> 
{
    public T find(K id);
    public List<T> find();
    public K save(T value);
    public void update(T value);
    public void delete(T value);
}

将工厂视为“虚拟构造函数”:其创建方法返回一个接口类型,但您可以根据需要请求其创建任意数量的不同实现。


2
@prema - 没关系。你不必使用泛型。 - Stephen C
18
@prema:这不是一个“给我代码”的网站。如果你仍然不明白,可以提出具体问题。 - Felix Kling
2
你正在将单例模式与工厂模式混合使用,并没有实现抽象工厂模式。我不确定这是否是他想要的,但你没有解释任何区别。这可能会导致他更加困惑。 - Merlyn Morgan-Graham
我也不喜欢单例。我会把它移除,这样我们俩都会感觉更好。 - duffymo
我已经理解了接口部分,但第二段代码让我感到困惑... - coder25
显示剩余3条评论

22

也许你不理解代码如何工作?它看起来很好。

仅供参考:

  • 如果将UserDAOImpl定义为UserDAOMySQLImpl,另一个新的定义为UserDAOMSSQLImpl等等,您可以更好地理解它,并且针对每个可能需要的数据库访问添加其他内容,例如处理连接以及该特定数据库服务器配置所需的私有函数,并且不强制在接口(UserDAO)中声明,但最低限度必须始终实现接口中定义的所有方法,然后在工厂(UserDAOFactory)条件中,您可以使用类似于以下内容的内容:

`

public class UserDAOFactory{

    public static UserDAO getUserDAO(String type){ 
        if (type.equalsIgnoreCase("mysql")){
            return new UserDAOMySQLImpl();
        }else{
            return new UserDAOMSSQLImpl();
        }
    }
}

更清晰了吗?

然后,在客户端,不要像硬编码一样写死一行代码:

UserDAO userDAO=UserDAOFactory.getUserDAO("jdbc");
您可以使用属性文件来动态切换DAO,从属性文件中检索字符串后,您只需执行以下操作即可:

您可以使用属性文件来动态切换DAO,从属性文件中获取该字符串后,您只需执行以下操作:

UserDAO userDAO=UserDAOFactory.getUserDAO(myStringFromPropertiesFile);

根据您属性文件中的定义,myStringFromPropertiesFile将包含"mysql"或"mssql"。

希望这可以帮助您!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接