创建型-建造者模式

2020/05/15

使用多个简单的对象一步一步构建成一个复杂的对象。

为什么用?

使用构造函数 ,你首先要决定使用哪一个,然后里面又是一堆参数,如果这些参数的类型很多又都一样,你还要搞清楚这些参数的含义,很容易就传混了

Javabean get set 在构建过程中对象的状态容易发生变化,造成错误。因为那个类中的属性是分步设置的。

什么时候用?

需要生成的对象具有复杂的内部结构,一些基本部件不会变,而其组合经常变化的时候。

当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。

例如: 计算机 游戏中的角色。

怎么用?

使用场景:创建电脑

  1. 在Computer 中创建一个静态内部类 Builder,然后将Computer 中的参数都复制到Builder类中。
  2. 在Computer中创建一个private的构造函数,参数为Builder类型
  3. 在Builder中创建一个public的构造函数,参数为Computer中必填的那些参数,cpu 和ram。
  4. 在Builder中创建设置函数,对Computer中那些可选参数进行赋值,返回值为Builder类型的实例
  5. 在Builder中创建一个build()方法,在其中构建Computer的实例并返回
/**
 * @author wuhongyun
 * @date 2020/5/4 22:28
 */
public class Computer {
    private String cpu;//必须
    private String ram;//必须
    private int usbCount;//可选
    private String keyboard;//可选
    private String display;//可选

    //在Computer中创建一个private的构造函数,参数为Builder类型
    private Computer(Builder builder) {
        this.cpu = builder.cpu;
        this.ram = builder.ram;
        this.usbCount = builder.usbCount;
        this.keyboard = builder.keyboard;
        this.display = builder.display;
    }

    // 在Computer 中创建一个静态内部类 Builder,然后将Computer 中的参数都复制到Builder类中。
    public static class Builder {
        private String cpu;//必须
        private String ram;//必须
        private int usbCount;//可选
        private String keyboard;//可选
        private String display;//可选

        //在Builder中创建一个public的构造函数,参数为Computer中必填的那些参数,cpu 和ram。
        public Builder(String cup, String ram) {
            this.cpu = cup;
            this.ram = ram;
        }

        //在Builder中创建设置函数,对Computer中那些可选参数进行赋值,返回值为Builder类型的实例
        public Builder setUsbCount(int usbCount) {
            this.usbCount = usbCount;
            return this;
        }

        public Builder setKeyboard(String keyboard) {
            this.keyboard = keyboard;
            return this;
        }

        public Builder setDisplay(String display) {
            this.display = display;
            return this;
        }

        //在Builder中创建一个build()方法,在其中构建Computer的实例并返回
        public Computer build() {
            return new Computer(this);
        }
    }
}

封装查询条件

public class SearchParam {
    private String fieldName;
    private Object value;
    private Operator operator;

    private SearchParam() {
    }

    public static SearchParam of(String fieldName, Operator operator, Object value) {
        return new SearchParam.Builder().fieldName(fieldName).operator(operator).value(value).build();
    }

    public String getFieldName() {
        return fieldName;
    }


    public Object getValue() {
        return value;
    }


    public Operator getOperator() {
        return operator;
    }

    public static class Builder {
        private SearchParam target;

        public Builder() {
            this.target = new SearchParam();
        }

        public Builder fieldName(String fieldName) {
            target.fieldName = fieldName;
            return this;
        }

        public Builder value(Object value) {
            target.value = value;
            return this;
        }

        public Builder operator(Operator operator) {
            target.operator = operator;
            return this;
        }

        public SearchParam build() {
            return this.target;
        }
    }
}

秒懂设计模式之建造者模式

Post Directory