摘要:設(shè)計模式之工廠模式工廠模式包括了簡單工廠工廠方法和抽象工廠。工廠方法模式下面我們針對普通工廠模式的缺點進行優(yōu)化。
設(shè)計模式之工廠模式
工廠模式包括了簡單工廠、工廠方法和抽象工廠。下面我從java實際應(yīng)用的角度分別介紹這三種模式。
簡單工廠模式下面看下JDBC中獲取Connection的代碼
public class ConnectionFactory { public Connection createConnection(String dbType,String serverName,String dbName,String userName,String password) throws SQLException { if(dbType.equalsIgnoreCase("mysql")) { try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } String url = "jdbc:mysql://"+serverName+":3306/"+dbName +"?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT"; return DriverManager.getConnection(url,userName,password); } else if(dbType.equalsIgnoreCase("postgresql")) { try { Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } String url = "jbdc:postgresql://"+serverName+":5432/"+dbName; return DriverManager.getConnection(url,userName,password); } else if(dbType.equalsIgnoreCase("MariaDB")) { try { Class.forName("org.mariadb.jdbc.Driver"); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } String url = "jdbc:mariadb://"+serverName+":3306/"+dbName; return DriverManager.getConnection(url,userName,password); } else { throw new IllegalArgumentException("未知的dbType參數(shù)類型"); } } }
這段代碼中就使用了簡單工廠模式。我們傳入不同的參數(shù)類型,工廠內(nèi)部就會創(chuàng)建不同的對象實例,我們根本不用管工廠內(nèi)部的實現(xiàn)邏輯是什么。
缺點:違背設(shè)計原則:對擴展開放,對修改關(guān)閉。因為假如我業(yè)務(wù)需要新增一個數(shù)據(jù)庫Connection 獲取方式就得修改這部分的代碼。
下面我們針對普通工廠模式的缺點進行優(yōu)化。
我們可以定義一個工廠方法接口IConnectionFactory ,包含一個方法,交給子類去實現(xiàn)各自的Connection創(chuàng)建方法
public interface IConnectionFactory { Connection create(String serverName,String dbName,String userName,String password) throws SQLException; }
創(chuàng)建PostgreSqlConnectionFactory工廠并實現(xiàn)IConnectionFactory接口
public class PostgreSqlConnectionFactory implements IConnectionFactory { @Override public Connection create(String serverName, String dbName, String userName, String password) throws SQLException { try { Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } String url = "jbdc:postgresql://"+serverName+":5432/"+dbName; return DriverManager.getConnection(url,userName,password); } }
創(chuàng)建MySqlConnectionFactory 工廠并實現(xiàn)IConnectionFactory接口
public class MySqlConnectionFactory implements IConnectionFactory { @Override public Connection create(String serverName, String dbName, String userName, String password) throws SQLException { try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } String url = "jdbc:mysql://" + serverName + ":3306/" + dbName + "?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT"; return DriverManager.getConnection(url, userName, password); } }
創(chuàng)建MariaDBConnectionFactory 工廠并實現(xiàn)IConnectionFactory接口
public class MariaDBConnectionFactory implements IConnectionFactory { @Override public Connection create(String serverName, String dbName, String userName, String password) throws SQLException { try { Class.forName("org.mariadb.jdbc.Driver"); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } String url = "jdbc:mariadb://"+serverName+":3306/"+dbName; return DriverManager.getConnection(url,userName,password); } }
測試方法
Connection conn = new MySqlConnectionFactory().create("127.0.0.1", "test", "root", "root");
工廠方法模式的優(yōu)點:新增一種類型,只需增加一個工廠,并實現(xiàn)抽象工廠即可。
缺點就是調(diào)用者需要知道調(diào)用的子類對象對應(yīng)的子類工廠。
上述的一個工廠對應(yīng)一個產(chǎn)品,如果一個工廠對應(yīng)多個產(chǎn)品那就是我們的抽象工廠模式了。比如 Connection 接口就是應(yīng)用了抽象工廠模式。其中的方法都是工廠方法,比如:createStatement、prepareStatement、prepareCall等他們都有對應(yīng)的實現(xiàn)類。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75001.html
摘要:時間年月日星期日說明本文部分內(nèi)容均來自慕課網(wǎng)。這對所有形態(tài)的工廠模式都是重要的這個系統(tǒng)的產(chǎn)品有至少一個的產(chǎn)品族同屬于一個產(chǎn)品族的產(chǎn)品是設(shè)計成在一起使用的。 時間:2017年08月27日星期日說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.c...
摘要:所謂的產(chǎn)品族,一般或多或少的都存在一定的關(guān)聯(lián),抽象工廠模式就可以在類內(nèi)部對產(chǎn)品族的關(guān)聯(lián)關(guān)系進行定義和描述,而不必專門引入一個新的類來進行管理。 0x01.定義與類型 定義:抽象工廠模式提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口 無需指定它們具體的類 類型:創(chuàng)建型 UML showImg(https://segmentfault.com/img/bVbtBp1?w=800&h=862...
摘要:主要詳解簡單工廠模式到抽象工廠模式的演變。抽象工廠模式當(dāng)一個類別的產(chǎn)品還有多個系列區(qū)分時,為了按系列生產(chǎn)商品,使用抽象工廠區(qū)分。 主要詳解簡單工廠模式到抽象工廠模式的演變。 簡單工廠模式 即靜態(tài)工廠模式1.將對象的創(chuàng)建和使用分開;2.將生產(chǎn)過程集中,便于集中管理;3.當(dāng)需要創(chuàng)建的對象類有變動時,就不用在所有new 的地方修改了,直接修改工廠類即可; /** * 簡單工廠模式 ---...
閱讀 1673·2023-04-26 02:43
閱讀 3105·2021-11-11 16:54
閱讀 1389·2021-09-23 11:54
閱讀 1207·2021-09-23 11:22
閱讀 2392·2021-08-23 09:45
閱讀 876·2019-08-30 15:54
閱讀 3127·2019-08-30 15:53
閱讀 3214·2019-08-30 15:53