生成器模式(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进行构建。
生成器模式调用顺序示意图