题目分析
-
配置文件保存多种数据库连接的信息,比如数据库用户名密码等信息,并且可以根据配置文件来切换数据库
-
有一个简单工厂来生成数据库的连接信息,具体的数据库操作延迟到子类中进行,外部类不知道具体的创建细节
-
工厂中先去读取配置文件,先判断要使用哪种数据库,然后去加载对应的数据库配置信息,并通过反射加载驱动,获得连接
-
外部在获取dao接口实例的时候不需要知道具体的创建细节,只需要去用就行
UML图
项目结构
代码
#在这里修改数据库的类型
DatabaseType=MySQL
#MySQL连接信息
mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/card
mysql.username=root
mysql.password=root
#Oracle连接信息
oracle.driver=oracle.jdbc.driver.OracleDriver
oracle.url=jdbc:oracle:thin:@localhost:1521:card
oracle.username=root
oracle.password=root
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private String password;
private Integer status;
public User() {
}
public User(String username, String password, Integer status) {
this.username = username;
this.password = password;
this.status = status;
}
}
public interface IUser {
void insert(User user);
void update(User user);
void delete(String username);
void select(String username);
}
public class MySQLUser implements IUser {
private Connection connection;
public MySQLUser(Connection connection) {
this.connection = connection;
}
@Override
public void insert(User user) {
String sql = "INSERT INTO user(username,password,status) values(?,?,?)";
try {
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, user.getUsername());
preparedStatement.setString(2, user.getPassword());
preparedStatement.setInt(3, user.getStatus());
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void update(User user) {
}
@Override
public void delete(String username) {
}
@Override
public void select(String username) {
}
}
public class OracleUser implements IUser {
private Connection connection;
public OracleUser(Connection connection) {
this.connection = connection;
}
@Override
public void insert(User user) {
}
@Override
public void update(User user) {
}
@Override
public void delete(String username) {
}
@Override
public void select(String username) {
}
}
public class Main {
public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException {
DataBaseFactory factory = new DataBaseFactory();
IUser iUser = factory.createMySQLUser();
iUser.insert(new User("Test", "123", 1));
iUser = factory.createOracleUser();
iUser.insert(new User("Test", "123", 1));
}
}
总结:
- 该模式的优缺点,特别从开闭原则论述
- 简单工厂模式可以隐藏对象的创建细节:如果在生成一个对象的时候,有很多步骤或者复杂的操作,可以考虑通过简单工厂封装创建对象的步骤,隐藏创建的过程,在这里就隐藏了连接数据库的具体细节,对外做到透明。
- 如果创建对象仅仅是通过new的方式就可以创建,那么不应该去使用工厂模式,否则会增加维护一个工厂类。
- 只需要修改配置文件的头部信息,就可以修改使用的数据库,避免了在代码内部修改时需要二次编译,在配置文件中修改,可以在运行期间进行。
- 编程中遇到的问题及解决方法
- 好像没有遇到问题
- 说一下应用场景:Log4J,MyBatis等都可以使用配置文件的方式,在运行期间修改参数