設計模式使用例項(5)——建造者模式例項之資料庫連線管理

zybing發表於2021-09-09
背景

要理解建造者模式,首先要理解農民工建築模式。

農民工建築模式就是靠經驗,對怎麼蓋這個屋子心裡大體有個數,優點就是自由靈活成本低,效果就是你很難掌控其中的每一個環節。比如戶外施工前必須先安裝防塵網和保護施工人員的攔網,這個基本規定都有可能無法落實。

建造者模式就厲害了,首先是制度化運營,必須得有個人現場指揮,這個人非常瞭解建造流程,而且要求所有施工人員必須按照流程來。這樣肯定成本高了點,畢竟至少多了一個人要給他發工資,但是確實在規範性、安全性方面得到提高。

建造者模式使用前的場景

在我們日常的專案中,有一個事情跟這個模型很像,就是資料庫連線物件的建立。

按照正常流程就是:

//mysql
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://127.0.0.1:3306/test";
            String name = "root";
            String pwd = "root";
            conn = DriverManager.getConnection(url,name ,pwd);
//oracle
            Class.forName("oracle.jdbc.driver.OracleDriver");
            String url = "jdbc:oracle:thin:@//127.0.0.1:1521/orcl";
            String name = "root";
            String pwd = "root";
            conn = DriverManager.getConnection(url,name ,pwd);

如果中間少了哪一步,比如name忘了賦值,這個可能就要有問題了。而且流程高度相似,完全可以請一個專業人員來管控這個流程。此處用建造者模式來改造上述流程。

使用建造者模式

OK,首先我們確定我們建造的物件是Connection,建造行為可定義為ConnectionBuilder抽象類,因為不管什麼Connection建造都是可以由這個抽象類描述的:

/**
 * 建造行為介面
 */
public abstract class ConnectionBuilder {
    protected String driver;
    protected String url;
    protected String name;
    protected String password;

    public abstract void buildDriver();
    public abstract void buildUrl();
    public abstract void buildName();
    public abstract void buildPassword();
    public abstract Connection createConnection() throws Exception;
}

然後我們請一個指揮官,這個指揮官非常瞭解Connection建造流程,只要他出手,必按流程走:

/**
 * 建造指揮官
 */
public class ConnectionDirector {
    public Connection construct(ConnectionBuilder builder) throws Exception {
        builder.buildDriver();
        builder.buildUrl();
        builder.buildName();
        builder.buildPassword();
        return builder.createConnection();
    }
}

然後來了個具體的建造任務,是要建造一個Mysql的連線物件,而且任務清單也出來了:

public class MysqlConnectionBuilder extends ConnectionBuilder {
        //每個方法表示建造過程中一個步驟/任務
    @Override
    public void buildDriver() {
        this.driver = "com.mysql.jdbc.Driver";
    }

    @Override
    public void buildUrl() {
        this.url = "jdbc:mysql://127.0.0.1:3306/test";
    }

    @Override
    public void buildName() {
        this.name = "root";
    }

    @Override
    public void buildPassword() {
        this.password = "root";
    }

    @Override
    public Connection createConnection() throws Exception {
        Class.forName(this.driver);
        return DriverManager.getConnection(url, name, password);
    }

}

OK,此時如果我們自己建,比如直接呼叫createConnection,就會忽略流程,可能有問題。

所以我們利用建造者模式,請指揮官來建:

public static void main(String[] args) throws Exception {
        ConnectionDirector director=new ConnectionDirector();
        Connection mysqlCon=director.construct(new MysqlConnectionBuilder());
    }
作用

用了指揮官之後,看似麻煩了,實際可擴充性更好了,比如再來個oracle、sqlserver資料庫,照樣給你建了,而且保證正確。

實際上設計模式就是透過語法的一些限制,保證一些事情的安全順利執行。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/855/viewspace-2812868/,如需轉載,請註明出處,否則將追究法律責任。

相關文章