什么是DAO工厂模式?

时间:2011-06-19 09:10:40

标签: java design-patterns dao

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

  1. 我想知道它的重要性。
  2. 用法
  3. 我查了this link,但我很难理解。

    有人可以借助一个例子来解释它吗?

    编辑:以下是我理解的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模式是否正确?

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

2 个答案:

答案 0 :(得分: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);
}

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

答案 1 :(得分:18)

您可能不明白的是代码是如何工作的?看起来很好。

仅供参考:

  • 如果您考虑将其命名为UserDAOMySQLImpl,将另一个新用户命名为UserDAOMSSQLImpl,则可以更好地理解定义为UserDAOImpl的内容,等等,以便您可能需要每个数据库访问。

  • 在每一个中你都应该处理连接,并为它可能需要的特定数据库服务器配置添加其他东西,如私有函数,而不是强制需要在接口(UserDAO)中声明,但至少你必须总是实现接口中定义的所有方法,然后在Factory(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之间切换,从你可以简单地执行的属性文件中检索到该字符串:

UserDAO userDAO=UserDAOFactory.getUserDAO(myStringFromPropertiesFile);
根据属性文件中的定义,

myStringFromPropertiesFile将包含“mysql”或“mssql”。

希望这有帮助!