設計模式之工廠方法(r4筆記第89天)
阿新 • • 發佈:2022-05-04
設計模式中,工廠方法模式的使用還是很頻繁的,但是似乎在工作中沒有留意或者重視。 在各大網站中對於工廠方法模式的例子一般都是舉女媧造人的例子,我就不做重複工作了,我覺得通過模擬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 <= columnCnt; i++) { System.out.print(rs.getMetaData().getColumnLabel(i) + "t "); } System.out.println(); while (rs.next()) { for (int i = 1; i <= columnCnt; 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(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; 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
。。。