设计模式-生成器模式Builder

1,734 阅读2分钟

生成器模式(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进行构建。

生成器模式调用顺序示意图