設計模式之工廠方法
設計模式中,工廠方法模式的使用還是很頻繁的,但是似乎在工作中沒有留意或者重視。
在各大網站中對於工廠方法模式的例子一般都是舉女媧造人的例子,我就不做重複工作了,我覺得透過模擬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 <= 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
。。。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1477364/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 設計模式之工廠方法模式|抽象工廠模式設計模式抽象
- 設計模式之工廠方法模式設計模式
- Java 設計模式之工廠方法模式與抽象工廠模式Java設計模式抽象
- Java設計模式之工廠方法模式Java設計模式
- golang設計模式之工廠方法模式Golang設計模式
- 設計模式系列之「工廠方法模式」設計模式
- Typescript 設計模式之工廠方法TypeScript設計模式
- 設計模式之-工廠方法-FactoryMethod設計模式
- 設計模式之工廠模式!深入解析簡單工廠模式,工廠方法模式和抽象工廠模式設計模式抽象
- 工廠方法模式GoF23種設計模式之建立型模式之工廠方法模式Go設計模式
- 設計模式-工廠模式二(工廠方法模式)設計模式
- Java常用設計模式之工廠方法模式Java設計模式
- 設計模式之工廠方法模式(FACTORY METHOD)設計模式
- 23種設計模式之工廠方法模式設計模式
- 設計模式-簡單工廠、工廠方法模式、抽象工廠模式設計模式抽象
- Java設計模式之簡單工廠、工廠方法和抽象工廠Java設計模式抽象
- 設計模式 - 工廠方法模式設計模式
- 設計模式-工廠方法模式設計模式
- 設計模式~~~工廠方法模式設計模式
- 設計模式——工廠方法模式設計模式
- 【設計模式】工廠方法模式設計模式
- 設計模式之工廠模式設計模式
- 設計模式之【工廠模式】設計模式
- 工廠方法--設計模式設計模式
- 【重溫設計模式】之003工廠方法模式設計模式
- 嘻哈說:設計模式之工廠方法模式設計模式
- 設計模式系列·工廠方法模式之Code Review設計模式View
- android常用設計模式之工廠方法模式Android設計模式
- Java程式設計之設計模式之工廠方法模式全解Java程式設計設計模式
- Java設計模式(工廠方法設計模式)Java設計模式
- java設計模式-工廠方法模式Java設計模式
- 一.設計模式之工廠設計模式設計模式
- 【重溫23種設計模式】之工廠方法模式設計模式
- JAVA設計模式之 工廠方法模式【Factory Method Pattern】Java設計模式
- Javascript 設計模式之工廠模式JavaScript設計模式
- 設計模式之工廠模式(三)設計模式
- 設計模式之工廠模式(二)設計模式
- 設計模式之工廠模式(一)設計模式