设计模式:建造者模式

定义

建造者模式将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示,属于创建型设计模式。

场景:

  • 相同方法,不同执行顺序,产生不同结果
  • 多个部件或零件,都可以装配到一个对象中,但是产生结果不同
  • 产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用。
  • 初始化一个对象特别复杂,参数多,而且很多参数都有默认值。

链式写法

@Data
public class Product {
    private String field;
    private String field2;
    private String field3;

}

public interface IBuild {
    Product build();
}

public class Build implements IBuild{

    private Product product = new Product();

    @Override
    public Product build() {
        return product;
    }

    public Build field(String field){
        product.setField(field);
        return this;
    }

    public Build field2(String field2){
        product.setField2(field2);
        return this;
    }

    public Build field3(String field3){
        product.setField3(field3);
        return this;
    }

    public Product builder(){
        return product;
    }
}

测试:

    public static void main(String[] args) {
        Product product = new Build().field("1").field2("2").field3("3").builder();
        System.out.println(product);
    }

uml:

image-20210103222608404

静态内部类写法

一般来说,静态内部类这种写法你可能遇见的次数要比上一种写法多,因为这种写法产品与创建之间的联系更加紧密,结构更加紧凑,建造者模式的形式更加简洁。

@Data
public class Product {

    private String field;
    private String field2;
    private String field3;

    public static class Builder{
        private Product product = new Product();

        public Product build() {
            return product;
        }

        public Builder field(String field){
            product.setField(field);
            return this;
        }

        public Builder field2(String field2){
            product.setField2(field2);
            return this;
        }

        public Builder field3(String field3){
            product.setField3(field3);
            return this;
        }

        public Product builder(){
            return product;
        }
    }
}

测试

        Product builder = new Product.Builder().field("1").field2("2").field3("3").builder();
        System.out.println(builder);

JDK源码中的运用

StringBuilder就是一个很典型的例子,它提供append方法,开放构造步骤,最后调用toString方法就可以获得一个构造好的字符串。

    ....
    @Override
    public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }

    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
    ....
        
        @Override
    public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }
    ....
原文地址:https://www.cnblogs.com/wwjj4811/p/14227299.html