【问题标题】:What is DAO factory pattern?什么是 DAO 工厂模式?
【发布时间】:2011-09-18 02:17:57
【问题描述】:

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

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

我查过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);

这个道模式正确吗?

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

【问题讨论】:

  • 您的MammalsFactory 创建SQLOracle ?有趣;)
  • 您是否已经检查了java.sun.com/blueprints/corej2eepatterns/Patterns/… 上“使用抽象工厂模式”部分中的示例代码?
  • 是的,但我无法理解...
  • 假设你有一些Databasesqloracle的实现,你已经成功实现了抽象工厂方法模式。你只需要弄清楚如何将sqloracle 实现为DAO。
  • 您的新实现看起来不错。至于连接,DAO 本身可能不应该控制它。工厂应该,或者用户应该。这样你就可以在 DAO 之间共享连接。

标签: java design-patterns dao


【解决方案1】:

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);
}

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

【讨论】:

  • @prema - 没关系。您不必使用泛型。
  • @prema:这不是一个给我代码的网站。如果您仍然不明白,请提出具体问题。
  • -1。您将单例模式与工厂模式混合在一起,而不是实现抽象工厂模式。我不确定这是否是他想要的,但你没有解释任何差异。这可能会让他更加困惑。
  • @duffymo:DAO 的解释很完美,我无法改进。 OP 的工厂实现(或多或少)正确地实现了抽象工厂模式,所以也许你应该删除那部分。抱歉,我将删除反对票。当人们使用单例时,我只是有点发疯;)
  • 我也不喜欢单身人士。我会删除它,让我们俩都感觉好点。
【解决方案2】:

可能你不明白代码是如何工作的?看起来不错。

仅供参考:

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

  • 1234563实现接口中定义的所有方法,然后在工厂(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”。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2014-08-04
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多