設計模式-生成器模式Builder

玩轉架構發表於2020-01-08

生成器模式(Builder),又叫建立者模式

定義:分離整體構建演算法和部件構造。

生成器模式結構示意圖:

設計模式-生成器模式Builder

Builder: 生成器介面,定義建立一個Product物件各個部件的操作。

ConcreteBuilder: 具體的生成器實現,實現各個部件的建立,並負責組裝Product物件的各個部件,同時還提供一個返回Product物件的方法。

Director: 指導者,主要用來使用Builder介面,以一個統一的過程來構建所需要的Product物件。

Product: 產品,表示被生成器構建的複雜物件,包含多個部件。

1:JDK中StringBuffer和StringBuilder的appdend方法使用的生成器模式:

 public final class StringBuffer extends AbstractStringBuilder{
    public synchronized StringBuffer append(String str) {
        super.append(str);
        return this;
    }    
    public synchronized String toString() {
        return new String(value, 0, count);
    }
 }
 
 public final class StringBuilder extends AbstractStringBuilder{
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
    public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }
 }
 
 abstract class AbstractStringBuilder{
    public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }
    public abstract String toString();    
 }
 
 Test:
 public static void main(String[] args) {
    StringBuilder s= new StringBuilder("你好").append(",我現在在研究")
    .append("建造者模式").append("希望能有所收穫.");
    System.out.println(s);
 }
 
 AbstractStringBuilder相當於Builder角色, 
 StringBuffer和StringBuilder相當於ConcreteBuilder角色,
 Test相當於Director角色。
 
 建造者最常用的其實是想上面Test類中的鏈式呼叫,因為我可以訂做這個產品的具體細節,
 你再給我多少個append()或者一些其他方法呼叫,我返回的還是StringBuilder這個物件,
 也就是這個產品不變,但是裡面的細節我有要求你給我做成什麼樣的。
 
複製程式碼

2:java.sql.PreparedStatement:


public interface PreparedStatement {
    void setString(int parameterIndex, String x) throws SQLException;
    void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException;
}

資料庫驅動如oracle、mysql等會實現這些方法。

客戶端呼叫:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                     SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
複製程式碼

Mybatis中用到的建造者模式:SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder等。 比如:XMLConfigBuilder讀取配置檔案構建出Configuration物件,然後SqlSessionFactoryBuilder使用Configuration物件作為引數,構建出SqlSessionFactory物件。 原因:這麼做的原因是Mybatis的初始化工作較複雜,不是一個建構函式就能包括的。所以採用了分層構建方法。例如Mybatis中極其重要的Configuration物件,它龐大且複雜,初始化比較麻煩,所以使用專門的建造者XMLConfigBuilder進行構建。

生成器模式呼叫順序示意圖

設計模式-生成器模式Builder

相關文章