设计模式中,工厂方法模式的使用还是很频繁的,但是似乎在工作中没有留意或者重视。
在各大网站中对于工厂方法模式的例子一般都是举女娲造人的例子,我就不做重复工作了,我觉得通过模拟oracle或者mysql的jdbc连接也是一个很生动的例子,我们完全可以通过工厂方法来模拟这种,对于不同的需求可以灵活的处理。
为此我画了如下的UML图。
我们定义一个借口GeneralJDBC,其中有各种jdbc中涉及到的方法,但是对于这些方法,可能在Oracle,MySQL中会有一些不同之处,或者在使用中的细节差别。
我们定义了两个实现类OracleJDBC和MySQLJDBC
在此基础上,我们在需要调用的时候,可以根据对应的GeneralJDBC实现类来初始化连接。初始化的部分在DBConnInit中,这个类是一个抽象类,在DBConnFactory就是工厂方法的实现了。
里面会根据对应的GeneralJDBC来做实际的实例化工作。
这些工作做完以后就可以通过客户端来调用了。
实现的代码如下:
调用客户端程序的结果如下:
TABLE_NAME TABLE_TYPE
LOGMNR_SESSION_EVOLVE$ TABLE
LOGMNR_EVOLVE_SEQ$ SEQUENCE
LOGMNR_SEQ$ SEQUENCE
LOGMNR_DIDS$ SEQUENCE
LOGMNR_UIDS$ SEQUENCE
。。。
在各大网站中对于工厂方法模式的例子一般都是举女娲造人的例子,我就不做重复工作了,我觉得通过模拟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.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleJDBC implements GeneralJDBC {
@Override
public Connection initConnection() throws SQLException {
return DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:test01", "system", "oracle");
}
@Override
public Statement createStatment(Connection tmp_Conn) throws SQLException {
return tmp_Conn.createStatement();
}
@Override
public ResultSet executeQuery(Statement tmp_stmt, String SQL)
throws SQLException {
return tmp_stmt.executeQuery(SQL);
}
@Override
public void getRsResults(ResultSet rs) throws SQLException {
int columnCnt;
columnCnt = rs.getMetaData().getColumnCount();
for (int i = 1; i System.out.print(rs.getMetaData().getColumnLabel(i) + "\t ");
}
System.out.println();
while (rs.next()) {
for (int i = 1; i System.out.print(rs.getString(i) + "\t ");
}
System.out.println();
}
}
}
点击(此处)折叠或打开
- 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(ClassT> dbDriverClass);
-
- }
点击(此处)折叠或打开
- public class DBConnFactory extends DBConnInit {
- @Override
- public GeneralJDBC initDBDriverClass(ClassGeneralJDBC> 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;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ConnClient {
public static void main(String[] args) throws SQLException {
new ConnClient().test();
}
public void test() throws SQLException{
Connection conn;
Statement stmt;
ResultSet rs;
DBConnInit factory = new DBConnFactory();
GeneralJDBC oracleJDBC = factory.initDBDriverClass(OracleJDBC.class);
conn = oracleJDBC.initConnection();
stmt = oracleJDBC.createStatment(conn);
rs = oracleJDBC.executeQuery(stmt, "select *from cat");
oracleJDBC.getRsResults(rs);
}
}
调用客户端程序的结果如下:
TABLE_NAME TABLE_TYPE
LOGMNR_SESSION_EVOLVE$ TABLE
LOGMNR_EVOLVE_SEQ$ SEQUENCE
LOGMNR_SEQ$ SEQUENCE
LOGMNR_DIDS$ SEQUENCE
LOGMNR_UIDS$ SEQUENCE
。。。