# Builder

# 介绍

Builder 模式,也称为建造者模式,是一种创建设计模式,它将一个复杂的构建与它的表示分离。

使得同样的构建过程可以创建不同的表示。这种模式通常用于创建具有多个属性的复杂对象,特别是当这些属性之间存在一定的依赖或顺序关系时。

# 原生代码实现

下面是 java 实现 builder 构建的方式

Person 类 其中 Builder 静态内部类是 构建器类

public class Person {
    private Integer id;
    private String name;
    private Person(Builder builder)
    {
        this.id = builder.id;
        this.name = builder.name;
    }
    public static class Builder
    {
        private Integer id;
        private String name;
        public Builder id(Integer id)
        {
            this.id = id;
            return this;
        }
        public Builder name(String name)
        {
            this.name = name;
            return this;
        }
        public Person build()
        {
            return new Person(this);
        }
        @Override
        public String toString() {
            return "Builder{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
    public static Builder builder()
    {
        return new Builder();
    }
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

Main

public class Main1 {
    public static void main(String[] args) {
        Person person = Person.builder()
                .id(1)
                .name("李四")
                .build();
        System.out.println(person);
    }
}

执行结果:

Person{id=1, name='李四'}

# 使用 @Builder

# 介绍 @Builder

lombok 库中的 @Builder 注解是一种实现 Builder 设计模式的工具。它可以帮助我们生成相对复杂的构建器 API,从而简化对象的创建过程

以下是 @Builder 的主要功能和作用

1、生成构建器类:@Builder 会为你的类生成一个名为 ThisClassBuilder 的内部静态类,这个类就是构建器。构建器类中包含了与原始类相同的属性

2、生成构建器方法:对于原始类中的每个参数,@Builder 会在构建器类中生成一个类似于 setter 的方法。这些方法的名称与参数名相同,返回值是构建器本身,这样就可以支持链式调用

3、生成 build 方法:构建器类中,@Builder 会生成一个 build () 方法。调用这个方法会根据设置的值创建实体对象

4、生成 toString 方法:@Builder 还会在构建器类中生成一个 toString () 方法。<font color='red'> 注意不是重写 Object 的 toString</font>.

5、生成 builder 方法:在原始类中,@Builder 会生成一个 builder () 方法。这个方法用于创建构建器

6、支持集合操作:@Builder 还可以配合 @Singular 注解来处理集合类型的字段。@Singular 可以生成添加单个元素到集合的方法,以及清空集合的方法。

下面是 java 代码演示

Teacher 类:

@Builder
@ToString
public class Teacher {
    private Integer id;
    private String name;
    @Singular
    private List<String> skills;
    @Singular
    private List<Student> students;
}

Student 类:

@Builder
@ToString
public class Student {
    private Integer id;
    private String name;
    @Singular
    private List<String> subjects;
}

Main

public class Main {
    public static void main(String[] args) {
        Teacher person = Teacher.builder()
                .id(1)
                .name("导师-张三")
                .skill("Java")
                .skill("C/C++")
                .skill("Python")
                .skill("Go")
                .skill("Javascript")
                .student(
                        Student.builder()
                                .id(1)
                                .name("李四")
                                .subject("Java")
                                .build()
                )
                .student(
                        Student.builder()
                                .id(1)
                                .name("王五")
                                .subject("Java")
                                .build()
                )
                .student(
                        Student.builder()
                                .id(1)
                                .name("李华")
                                .subject("Java")
                                .build()
                )
                .build();
        System.out.println(person);
    }
}

执行结果:

Teacher(id=1, name=导师-张三, skills=[Java, C/C++, Python, Go, Javascript], students=[Student(id=1, name=李四, subjects=[Java]), Student(id=1, name=王五, subjects=[Java]), Student(id=1, name=李华, subjects=[Java])])