高级构建器设计模式 — 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 仓库:链接
最后
这是我的第一篇文章。希望您阅读愉快。