> 文档中心 > 05-设计模式——建造者(生成器)模式

05-设计模式——建造者(生成器)模式


设计模式——建造者(生成器)模式

生成器Builder

封装一个对象的构造过程,并允许按步骤构造。

05-设计模式——建造者(生成器)模式

模式定义:

将一个复杂对象的创建与他的表示分离,使得同样的构建过程可以创建不同的表示

应用场景

  1. 需要生成的对象具有复杂的内部结构
  2. 需要生成的对象内部属性本身相互依赖
  3. 与不可变对象配合使用

优点

  1. 建造者独立、易扩展
  2. 便于控制细节风险

V1复杂版本

package com.example.designpatterns.builder.v1;import lombok.Data;/ * @program: DesignPatterns * @description: 构造者模式 V1-复杂版本 * @author: Coder_Pan * @create: 2022-04-13 10:01 /public class BuilderTest {    public static void main(String[] args) { DefaultConcreateProductBuilder defaultConcreateProductBuilder = new DefaultConcreateProductBuilder(); Director director = new Director(defaultConcreateProductBuilder); Product product = director.makeProduct("螺蛳粉", "panpan", "p1", "p2", "p3", "p4"); System.out.println(product); System.out.println("-------------------------------------------------------------------"); NewConcreateProductBuilder newBuilder = new NewConcreateProductBuilder(); Director director1 = new Director(newBuilder); Product product1 = director.makeProduct("new螺蛳粉", "panpan", "p1", "p2", "p3", "p4"); System.out.println(product1);    }}/ * 定义构建者模式 */interface ProductBuilder {    /     * 创建对象     * @return     */    Product build();    /     * builderProductName     * @param productName     */    void builderProductName(String productName);    /     * builderCompanyName     * @param companyName     */    void builderCompanyName(String companyName);    /     * buildPart1     * @param part1     */    void buildPart1(String part1);    /     * buildPart2     * @param part2     */    void buildPart2(String part2);    /     * buildPart3     * @param part3     */    void buildPart3(String part3);    /     * buildPart4     * @param part4     */    void buildPart4(String part4);}/ * 创建构造者模式实现类 * * 默认  =>  Default */class  DefaultConcreateProductBuilder implements ProductBuilder {    /     * 若干个属性     */    private String productName;    private String companyName;    private String part1;    private String part2;    private String part3;    private String part4;    @Override    public Product build() { return new Product(this.productName,this.companyName,this.part1,this.part2,this.part3,this.part4);    }    @Override    public void builderProductName(String productName) { this.productName = productName;    }    @Override    public void builderCompanyName(String companyName) { this.companyName = companyName;    }    @Override    public void buildPart1(String part1) { this.part1 = part1;    }    @Override    public void buildPart2(String part2) { this.part2 = part2;    }    @Override    public void buildPart3(String part3) { this.part3 = part3;    }    @Override    public void buildPart4(String part4) { this.part4 = part4;    }}/ * 另外一个产品构造器 * * 可以使用另外一种建造方式 */class  NewConcreateProductBuilder implements ProductBuilder {    /     * 若干个属性     */    private String productName;    private String companyName;    private String part1;    private String part2;    private String part3;    private String part4;    @Override    public Product build() { return new Product(this.productName,this.companyName,this.part1,this.part2,this.part3,this.part4);    }    @Override    public void builderProductName(String productName) { this.productName = productName;    }    @Override    public void builderCompanyName(String companyName) { this.companyName = companyName;    }    @Override    public void buildPart1(String part1) { this.part1 = part1;    }    @Override    public void buildPart2(String part2) { this.part2 = part2;    }    @Override    public void buildPart3(String part3) { this.part3 = part3;    }    @Override    public void buildPart4(String part4) { this.part4 = part4;    }}/ * 定义一个导向器 */class Director {    private ProductBuilder builder;    /     * 通过构造函数将构造者传入     *     * @param builder     */    public Director(ProductBuilder builder){ this.builder = builder;    }    /     * 控制构造顺序     */    public Product makeProduct(String productName, String companyName, String part1, String part2, String part3, String part4){ builder.builderProductName(productName); builder.builderCompanyName(companyName); builder.buildPart1(part1); builder.buildPart2(part2); builder.buildPart3(part3); builder.buildPart4(part4); Product build = builder.build(); return build;    }}/ * 定义一个产品对象  => Product * * 通过lombok简化get、set方法 */@Dataclass Product {    /     * 若干个属性     */    private String productName;    private String companyName;    private String part1;    private String part2;    private String part3;    private String part4;    //.....若干个属性    /     * 空参构造     */    public Product(){    }    /     * 全参构造     * @param productName     * @param companyName     * @param part1     * @param part2     * @param part3     * @param part4     */    public Product(String productName, String companyName, String part1, String part2, String part3, String part4){ this.productName = productName; this.companyName = companyName; this.part1 = part1; this.part2 = part2; this.part3 = part3; this.part4 = part4;    }}

V2-精简版本

package com.example.designpatterns.builder.v2;import lombok.Data;/ * @program: DesignPatterns * @description: 构造者模式 V2-精简版本 ==>  链式编程 * @author: Coder_Pan * @create: 2022-04-13 10:33 /public class ProductTestV2 {    public static void main(String[] args) { Product product = new Product.Builder()  //链式调用.....  .productName("XXXX")  .companyName("123p_p")  .part1("1111")  .part2("2222")  .part3("3333")  .part4("4444")  .build();//通过build,最终生成实例 System.out.println(product);    }}/ * 定义一个产品对象  => Product * * 通过lombok简化get、set方法 */@Dataclass Product {    /     * 若干个属性     * final  =>  在构建的时候才会将真实的值传入,传入之后就不能再次修改了.....     */    private final String productName;    private final String companyName;    private final String part1;    private final String part2;    private final String part3;    private final String part4;    //.....若干个属性    /     * 全参构造     * @param productName     * @param companyName     * @param part1     * @param part2     * @param part3     * @param part4     */    public Product(String productName, String companyName, String part1, String part2, String part3, String part4){ this.productName = productName; this.companyName = companyName; this.part1 = part1; this.part2 = part2; this.part3 = part3; this.part4 = part4;    }    /     * 定义静态内部构造器     *     */    static class Builder { /  * 若干个属性  */ private String productName; private String companyName; private String part1; private String part2; private String part3; private String part4; public Builder productName(String productName){     this.productName = productName;     return this; } public Builder companyName(String companyName){     this.companyName = companyName;     return this; } public Builder part1(String part1){     this.part1 = part1;     return this; } public Builder part2(String part2){     this.part2 = part2;     return this; } public Builder part3(String part3){     this.part3 = part3;     return this; } public Builder part4(String part4){     this.part4 = part4;     return this; } /  *  * @return product实例  */ Product build(){     //校验操作     Product product = new Product(this.productName, this.companyName, this.part1, this.part2, this.part3, this.part4);     return product; }    }}

StringBuilder

以下是一个简易的 StringBuilder 实现,参考了 JDK 1.8 源码。

public class AbstractStringBuilder {    protected char[] value;protected int count;public AbstractStringBuilder(int capacity) {    count = 0;    value = new char[capacity];}public AbstractStringBuilder append(char c) {    ensureCapacityInternal(count + 1);    value[count++] = c;    return this;}private void ensureCapacityInternal(int minimumCapacity) {    // overflow-conscious code    if (minimumCapacity - value.length > 0) expandCapacity(minimumCapacity);}void expandCapacity(int minimumCapacity) {    int newCapacity = value.length * 2 + 2;    if (newCapacity - minimumCapacity < 0) newCapacity = minimumCapacity;    if (newCapacity < 0) { if (minimumCapacity < 0) // overflow     throw new OutOfMemoryError(); newCapacity = Integer.MAX_VALUE;    }    value = Arrays.copyOf(value, newCapacity);}}
public class StringBuilder extends AbstractStringBuilder {    public StringBuilder() { super(16);    }    @Override    public String toString() { // Create a copy, don't share the array return new String(value, 0, count);    }}
public class Client {    public static void main(String[] args) { StringBuilder sb = new StringBuilder(); final int count = 26; for (int i = 0; i < count; i++) {     sb.append((char) ('a' + i)); } System.out.println(sb.toString());    }}

JDK

  • java.lang.StringBuilder
  • java.nio.ByteBuffer
  • java.lang.StringBuffer
  • java.lang.Appendable
  • [Apache Camel builders](

05-设计模式——建造者(生成器)模式 与50位技术专家面对面 05-设计模式——建造者(生成器)模式 20年技术见证,附赠技术全景图