发布于 2026-01-06 3 阅读
0

高级建造者设计模式 — Java 简介:简单示例:注释:SimpleStudentBuilder 类:SimpleStudentBuilder 的用法:深入了解建造者设计模式 :) 步骤建造者设计模式:StudentStepBuilder 的用法说明:编码时间:StudentStepBuilder 的用法:最终中等:

高级构建器设计模式 — Java

介绍:

简单示例:

备注:

SimpleStudentBuilder 类:

SimpleStudentBuilder 用法:

深入研究建筑设计模式 :)

步骤构建器设计模式:

StudentStepBuilder 的使用说明:

编码时间:

StudentStepBuilder 的用法:

最后

中等的:

介绍:

每种设计模式都是为了解决一个众所周知的问题而出现的。
建造者设计模式的问题是:
一个类中包含大量变量。假设我们有一个 Student 类,它的构造函数包含 10 个不同类型的变量。当团队成员想要创建该类的对象时,由于变量数量庞大,他会遇到一些困难。

因此,建造者设计模式应运而生,它提供了一种不包含变量的方法,并使用另一个 setter 来填充构造函数所需的必要参数。

简单示例:

我们想将建造者设计模式应用到学生示例中。

public class Student {

private int id;
private String name;
private String major;
private String mobileNumber;
private double salary;

// Optional Private Constructor
pu Student(int id, String name, String major, String mobileNumber) {
    this.id = id;
    this.name = name;
    this.major = major;
    this.mobileNumber = mobileNumber;
}


public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getMajor() {
    return major;
}

public void setMajor(String major) {
    this.major = major;
}

public String getMobileNumber() {
    return mobileNumber;
}

public void setMobileNumber(String mobileNumber) {
    this.mobileNumber = mobileNumber;
}

public double getSalary() {
    return salary;
}

public void setSalary(double salary) {
    this.salary = salary;
}

}

要应用构建器设计模式,我们需要一个新类来收集数据变量,在用户填写完所有参数数据后,我们从 Student 类创建对象,因此我们需要声明 'SimpleStudentBuilder' 类。

备注:

  • 我们需要将“SimpleStudentBuilder”类声明为Student类的内部类,因为我们需要将Student构造函数更改为私有且为内部类,这样我们就可以从Student类初始化新对象。

  • 我们还需要将 'SimpleStudentBuilder' 声明为静态方法,因为我们可以从外部类中使用它,而不是从 student 类中初始化对象 :)

SimpleStudentBuilder 类:

// 此类是 Student 类的内部类

public static class SimpleStudentBuilder {

private int id;
private String name;
private String major;
private String mobileNumber;
private double salary;


public SimpleStudentBuilder() {
}

public SimpleStudentBuilder setId(int id) {
    this.id = id;
    return this;
}

public SimpleStudentBuilder setName(String name) {
    this.name = name;
    return this;
}

public SimpleStudentBuilder setMajor(String major) {
    this.major = major;
    return this;
}

public SimpleStudentBuilder setMobileNumber(String mobileNumber)     {
    this.mobileNumber = mobileNumber;
    return this;
}

public SimpleStudentBuilder setSalary(double salary) {
    this.salary = salary;
    return this;
}

public Student build() {
    // TODO : Check All Require Parameters is not null
    if (id == 0)
        throw new NullPointerException("Id Can't be with out value");

    if (name == null)
        throw new NullPointerException("Name Can't be Null");

    if (major == null)
        throw new NullPointerException("Major Can't be Null");

    if (mobileNumber == null)
        throw new NullPointerException("Number Can't be Null");

    Student student = new Student(id, name, major, mobileNumber);
    student.salary = salary;

    return student;
}

}

您可以在 GitHub 仓库中查看完整代码。

SimpleStudentBuilder 用法:

public static void main(String[] args) {

Student student = new Student.SimpleStudentBuilder()
        .setMajor("IT")
        .setName("Kareem Radwa")
        .setMobileNumber("0597190510")
        .setSalary(1000)
        .setId(32)
        .build();

}

深入研究建筑设计模式 :)

假设在 Student 构造函数中,我们按优先级传递参数值,例如按 [id, name, major, mobile number] 的顺序。如果这种安排消失了,您将无法从 Student 类创建对象。

所以我们需要解决这个问题,答案是使用步骤构建器,但是我们该如何实现这个答案呢?请继续阅读 :)

步骤构建器设计模式:

要应用这个想法,你需要

我们需要多个接口,每个接口都对应一个 Require 变量。例如,在我们的 Student 类中,我们需要 4 个接口,此外,还需要一个用于 Build 方法的接口以及一些可选变量。
该类实现了上述所有接口,我们需要在“步骤”部分添加标题。

StudentStepBuilder 的使用说明:

当我们需要使用这种构建器方法时,第一次只需要显示 id 设置方法,如果用户填写了该方法,之后就可以设置 Name 变量的值等等。

编码时间:

public class StudentStepBuilder {

public static IdFiled newBuilder() {

    return new Steps();

}


public static interface IdFiled {
    NameFiled setId(int id);
}

public static interface NameFiled {

    MajorFiled setNmae(String name);

}

public static interface MajorFiled {

    MobileNumber setMajor(String major);

}

public static interface MobileNumber {

    BuildStep setMobile(String mobile);

}


public static interface BuildStep {

    BuildStep setSalary(double salary);

    Student build();
}

private static class Steps implements IdFiled, NameFiled, MajorFiled, MobileNumber, BuildStep {

    private int id;

    private String name;

    private String major;

    private String mobileNumber;

    private double salary;


    @Override
    public NameFiled setId(int id) {
        this.id = id;
        return this;
    }

    @Override
    public MajorFiled setNmae(String name) {
        this.name = name;
        return this;
    }

    @Override
    public MobileNumber setMajor(String major) {
        this.major = major;
        return this;
    }

    @Override
    public BuildStep setSalary(double salary) {
        this.salary = salary;
        return this;
    }

    @Override
    public BuildStep setMobile(String mobile) {
        this.mobileNumber = mobile;
        return this;
    }

    @Override
    public Student build() {
        if (id == 0) {
            throw new NullPointerException("ID Can't be 0");
        }
        if (name == null) {
            throw new NullPointerException("Name can't be null");
        }


        if (major == null) {
            throw new NullPointerException("Major can't be null");
        }

        if (mobileNumber == null) {
            throw new NullPointerException("Mbile Number can't be null");
        }

        Student student = new Student(id, name, major, mobileNumber);
        student.setSalary(salary);

        return student;
    }


}

}

StudentStepBuilder 的用法:

步骤构建器设计模式的最终结果,
所有代码都已上传至 GitHub 仓库:链接

最后

这是我的第一篇文章。希望您阅读愉快。

中等的:

文章来源:https://dev.to/kareemradwan/advance-builder-design-pattern-java-3pab