首先是他的重要性,在effective-java中第二条就建议使用建造者模式,在23种设计模式中,他是一个生产模式,定位十分准确,使用这种模式可以让我们更好的创建一个类,适合什么时候使用,构造方法参数多余四个以及将来可能扩展到四个的时候,生产的时候务必考虑到将来的扩展性,如果初期使用了工厂模式来生产,后期参数增加需要修改,会让工厂模式变得十分尴尬。
其原理是充分利用了java得特性以及语法,建造者模式核心就是this关键字以及内部类,接下来就由一个例子来说明吧,如果我们要创建一个People类,有name,age,weight,height或者更多得属性,如果直接用四个参数得构造方法是非常头疼得,我们需要知道这四个构造参数得顺序以及意义,在开发得时候有代码提示或许好一点,但是维护得时候需要阅读大量代码就非常致命了,回到Buider模式,和普通类得区别是,我们需要一个public static final修饰得Buider内部类,public是为了People类能访问到,静态是为了不用声明内部类,final修饰是为了保证不可变,(老实说,作者此处也没具体注意到final得作用,只明白static final是一种常见甚至是必须得修饰),Buider类也需要和People一样得私有属性,给每一个属性添加一个类似set方法得方法,命名直接是属性名即可,参数名统一使用val,返回类型是Builder,我们直接返回this即可,最后需要一个返回类型是People,参数是Builder无参构造方法,return new People(this),此处this就是这个内部类,细心得读者可能发现了People类并没有这个方法,于是我们需要给People添加一个参数是Builder的构造方法,直接将Build的属性赋值给People类,此时完成了建造者模式,达到链式编程的目的。
内部类方法参数使用val是为了和其他区分,是一种良好的编程习惯,final修饰内部类或许是保证了每个赋值方法返回的this是同一个this吧
完整代码如下:这只是一个示例,在具体使用中可灵活变换,比如在外部类使用带参构造先赋值两个参数
package com.yizhi.practice.design; /** * @Author: Zing * @Date: 2022/09/13/18:01 * @Description: */ public class MyBuilder { public static void main(String[] args) { People people = new People.Builder() .age(10) .height(180) .weight(800) .name("张三").build(); } } class People{ private Integer age; private Integer weight; private Integer height; private String name; //内部类 public static final class Builder{ private Integer age; private Integer weight; private Integer height; private String name; //赋值方法 public Builder age(Integer val){ age = val; return this; } public Builder weight(Integer val){ weight = val; return this; } public Builder height(Integer val){ height = val; return this; } public Builder name(String val){ name = val; return this; } //使内部类和外部类高内聚 public People build(){ return new People(this); } } //通过内部类为外部内赋值 public People(Builder builder){ age = builder.age; name = builder.name; weight = builder.weight; height = builder.height; } }