生成器模式(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進行構建。
生成器模式呼叫順序示意圖