【问题标题】:Whats better, inheriting DatabaseManager class or making that a singleton object to implement DAO pattern? Why?更好的是,继承 DatabaseManager 类或将其作为单例对象来实现 DAO 模式?为什么?
【发布时间】:2014-08-22 03:36:05
【问题描述】:

我正在学习 SRP 并且不得不减少包含太多信息的客户对象的责任。所以我把它变成了一个 Pojo 并提取了数据库逻辑。 我正在尝试为此设置找到最佳设计,并在使 DatabaseManager 类成为父类或可以返回单个连接对象的单例之间进行分裂。该系统将用于从数据库中插入和删除客户。我不希望我的域对象/DAO 担心连接细节。我目前的设计是否强烈遵循 OOP 设计原则?

public class DatabaseManager {

    private Connection conn;

    private static DatabaseManager managerInstance = new DatabaseManager();

    private DatabaseManager() {

    }

    public static DatabaseManager getInstance() {
        return managerInstance;
    }

    /**
     * contains connection details
     * 
     * @throws SQLException
     */
    public void connect() throws SQLException {
        System.out.println("Established Database Connection...");
        conn = DriverManager.getConnection("Some/Database/URL");
    }

    public Connection getConnectionObject() {
        return conn;
    }

    public void disconnect() throws SQLException {
        conn.close();
        System.out.println("Disconnected from Database...");
    }
}

这是客户对象:

public class Customer {

       private int id;
       private String name;
       private boolean active;


       public Customer(int id, String name, String department, boolean working) {
              super();
              this.id = id;
              this.name = name;
              this.department = department;
              this.working = working;
       }

       @Override
       public String toString() {
              return "Customer [id=" + id + ", name=" + name + ", department="
                           + department + ", working=" + working + "]";
       }
}

客户 DAO:

public class CustomerDAO {

    public CustomerDAO() {
    }

    public void addCustomer(Customer Customer) throws SQLException {
        DatabaseManager.getInstance().getConnectionObject().prepareStatement("some sql... ");
    }

    public void removeCustomer(Customer Customer) throws SQLException {
        DatabaseManager.getInstance().getConnectionObject().prepareStatement("some sql... ");
        // implementation details avoided
    }

}

【问题讨论】:

  • 我不会选择在 2014 年实现新的DatabaseManager。有很多好的连接池实现,我会使用其中的一个。
  • 节省一些时间并使用 Spring Data JPA
  • Singleton...个人...这种资源管理确实需要在一个地方完成 - 个人。
  • @MadProgrammer 谢谢。你能详细说明为什么这样会更好吗?如果有多个连接对象实例会发生什么?如果多个 DAO(例如 productDAO、employeeDAO)都使用单例发布数据库命令怎么办?这不会导致数据库出现问题吗?你能告诉我吗?谢谢!
  • 再次,这是为了学习 OOP 设计而不是选择最新技术。

标签: java oop design-patterns object-oriented-analysis


【解决方案1】:

恕我直言,既不是继承也不是单例是最好的设计。

继承用于建模“is-a”。 CustomerDAO 不是 DatabaseManager,您不想将 DatabaseManager 的功能暴露给 CustomerDAO 的客户端,因此您不应该使用继承。在question 的答案中有一个很好的解释。

这里可以使用单例模式。然而,它使 CustomerDAO 与 DatabaseManager 紧密结合。

最好定义DatabaseManager的接口:

public interface DatabaseManager {
    public Connection getConnectionObject();
}

public class DatabaseManagerImpl implements DatabaseManager {
    // ...
}

然后可以通过setter方法或构造方法将DatabaseManager实现注入DAO。

public class CustomerDAO {

    private DatabaseManager databaseManager;

    public void setDatabaseManager(DatabaseManager databaseManager) {
        this.databaseManager = databaseManager;
    }

    public void addCustomer(Customer Customer) throws SQLException {
        databaseManager.getConnectionObject().prepareStatement("some sql... ");
    }

}

【讨论】:

    猜你喜欢
    • 2021-12-27
    • 2020-04-16
    • 1970-01-01
    • 2011-04-30
    • 2016-10-05
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多