依赖 DAOFactory 的 DAO 的优点和缺点
Pros and Cons of DAO dependent on DAOFactory
最近我发现 DAO 有一个 DAOFactory 实例的代码。而DAOFactory有Connection。 DAO 使用 DAOFactory 的连接来进行操作。基本上 DAO 依赖于 DAOFactory。这是代码:
DAOFactory.java:
public abstract class DAOFactory {
public static final int SQL_SERVER = 1;
public static final int MY_SQL = 2;
private Connection connection = null;
public static DAOFactory getDAOFactory(int daoFactoryType) {
DAOFactory daoFactory = null;
switch (daoFactoryType) {
case SQL_SERVER:
daoFactory = new SQLServerDAOFactory();
break;
case MY_SQL:
daoFactory = new MySQLDAOFactory();
break;
}
return daoFactory;
}
public Connection getConnection() {
return connection;
}
public void setConnection(Connection connection) {
this.connection = connection;
}
public abstract UserDAO getUserDAO();
...
}
BaseDAO.java:
public abstract class BaseDAO {
protected DAOFactory daoFactory;
public BaseDAO(DAOFactory daoFactory) {
this.daoFactory = daoFactory;
}
}
UserDAO.java:
public interface UserDAO {
public User getUserById(int userId) throws DAOException;
...
}
SQLServerUserDAO.java:
public class SQLServerUserDAO extends BaseDAO implements UserDAO {
public SQLServerUserDAO (DAOFactory daoFactory) {
super(daoFactory);
}
@Override
public User getUserById(int userId) throws DAOException {
// it uses the connection this way: this.daoFactory.getConnection();
// implementation
}
}
SQLServerDAOFactory.java:
public final class SQLServerDAOFactory extends DAOFactory {
@Override
public UserDAO getUserDAO() {
UserDAO userDAO = null;
userDAO = new SQLServerUserDAO(this);
return userDAO;
}
}
我通常看到 DAO 有 Connection,但这个有 DAOFactory。
与具有 Connection 的 DAO 相比,使用具有 DAOFactory 的 DAO 方法的优缺点是什么?
优点:
- 根据所需的数据库连接创建对象。
- 然后根据创建的数据库创建User。
- 遵循标准的抽象工厂设计模式。
缺点:
- 无需为单独的连接使用单独的 UserDAO。本来可以用一个 class.
具有 DAOFactory 的 DAO 意味着更改工厂中的连接将更改从它创建的每个 dao 中的连接。这允许在已知连接实例之前创建 DAO。
它的缺点是在 DAOFactory 和 DAO 之间创建循环依赖关系,并导致 DAO 具有比它们需要的更多的依赖关系,这会增加代码的复杂性。
最近我发现 DAO 有一个 DAOFactory 实例的代码。而DAOFactory有Connection。 DAO 使用 DAOFactory 的连接来进行操作。基本上 DAO 依赖于 DAOFactory。这是代码:
DAOFactory.java:
public abstract class DAOFactory {
public static final int SQL_SERVER = 1;
public static final int MY_SQL = 2;
private Connection connection = null;
public static DAOFactory getDAOFactory(int daoFactoryType) {
DAOFactory daoFactory = null;
switch (daoFactoryType) {
case SQL_SERVER:
daoFactory = new SQLServerDAOFactory();
break;
case MY_SQL:
daoFactory = new MySQLDAOFactory();
break;
}
return daoFactory;
}
public Connection getConnection() {
return connection;
}
public void setConnection(Connection connection) {
this.connection = connection;
}
public abstract UserDAO getUserDAO();
...
}
BaseDAO.java:
public abstract class BaseDAO {
protected DAOFactory daoFactory;
public BaseDAO(DAOFactory daoFactory) {
this.daoFactory = daoFactory;
}
}
UserDAO.java:
public interface UserDAO {
public User getUserById(int userId) throws DAOException;
...
}
SQLServerUserDAO.java:
public class SQLServerUserDAO extends BaseDAO implements UserDAO {
public SQLServerUserDAO (DAOFactory daoFactory) {
super(daoFactory);
}
@Override
public User getUserById(int userId) throws DAOException {
// it uses the connection this way: this.daoFactory.getConnection();
// implementation
}
}
SQLServerDAOFactory.java:
public final class SQLServerDAOFactory extends DAOFactory {
@Override
public UserDAO getUserDAO() {
UserDAO userDAO = null;
userDAO = new SQLServerUserDAO(this);
return userDAO;
}
}
我通常看到 DAO 有 Connection,但这个有 DAOFactory。
与具有 Connection 的 DAO 相比,使用具有 DAOFactory 的 DAO 方法的优缺点是什么?
优点:
- 根据所需的数据库连接创建对象。
- 然后根据创建的数据库创建User。
- 遵循标准的抽象工厂设计模式。
缺点:
- 无需为单独的连接使用单独的 UserDAO。本来可以用一个 class.
具有 DAOFactory 的 DAO 意味着更改工厂中的连接将更改从它创建的每个 dao 中的连接。这允许在已知连接实例之前创建 DAO。
它的缺点是在 DAOFactory 和 DAO 之间创建循环依赖关系,并导致 DAO 具有比它们需要的更多的依赖关系,这会增加代码的复杂性。