我知道工厂和抽象工厂方法,但我想用Java创建一个DAO工厂模式。
我查了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模式是否正确?
我应该在哪里打开连接并关闭它?
答案 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”。
希望这有帮助!