设计模式中,工厂方法模式的使用还是很频繁的,但是似乎在工作中没有留意或者重视。在各大网站中对于工厂方法模式的例子一般都是举女娲造人的例子,我就不做重复工作了,我觉得通过模拟oracle或者mysql的jdbc连接也是一个很生动的例子,我们完全可以通过工厂方法来模拟这种,对于不同的需求可以灵活的处理。为此我画了如下的UML图。我们定义一个借口GeneralJDBC,其中有各种jdbc中涉及到的方法,但是对于这些方法,可能在Oracle,MySQL中会有一些不同之处,或者在使用中的细节差别。我们定义了两个实现类OracleJDBC和MySQLJDBC在此基础上,我们在需要调用的时候,可以根据对应的GeneralJDBC实现类来初始化连接。初始化的部分在DBConnInit中,这个类是一个抽象类,在DBConnFactory就是工厂方法的实现了。里面会根据对应的GeneralJDBC来做实际的实例化工作。这些工作做完以后就可以通过客户端来调用了。实现的代码如下:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public interface GeneralJDBC {
public Connection initConnection() throws SQLException;
public Statement createStatment(Connection conn) throws SQLException;
public ResultSet executeQuery(Statement stmt,String SQL) throws SQLException;
public void getRsResults(ResultSet rs) throws SQLException;
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class MySQLJDBC implements GeneralJDBC{
@Override
public Connection initConnection() {
return null;
}
@Override
public Statement createStatment(Connection conn) {
return null;
}
@Override
public ResultSet executeQuery(Statement stmt, String SQL) {
return null;
}
@Override
public void getRsResults(ResultSet rs) {
// TODO Auto-generated method stub
}
}
public abstract class DBConnInit {
public abstract <T extends GeneralJDBC> T initDBDriverClass(Class<T> dbDriverClass);
}
public class DBConnFactory extends DBConnInit {
@Override
public GeneralJDBC initDBDriverClass(Class<GeneralJDBC> dbDriverClass) {
GeneralJDBC dbDriver = null;
try {
dbDriver = (GeneralJDBC) Class.forName(dbDriverClass.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return dbDriver;
}
}
import java.sql.Connection;
调用客户端程序的结果如下:
TABLE_NAME TABLE_TYPE LOGMNR_SESSION_EVOLVE$ TABLE LOGMNR_EVOLVE_SEQ$ SEQUENCE LOGMNR_SEQ$ SEQUENCE LOGMNR_DIDS$ SEQUENCE LOGMNR_UIDS$ SEQUENCE。。。