首先是他的重要性,在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吧 完整代码如下:这只是一个示例,在具体使用中可灵活变换,比如在外部类使用带参构造先赋值两个参数
代码语言:javascript复制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;
}
}