Introduction:
每种设计模式都可以解决一个众所周知的问题。 生成器设计模式的问题是: 在构建器内部有一个包含很多变量的类。 假设我们有一个Student类,它有一个包含10个不同类型变量的构造函数。 当团队成员之一想要创建该类的对象时,由于大量的变量,他将面临一些困难。
因此开发了Builder设计模式来解决此问题,方法是提供一种不包含变量的方法,并使用另一个setter来为构造函数填充必要的参数。
Simple Example :
我们想将Builder设计模式应用于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;
}
}
要应用Builder设计模式,我们需要一个New类来收集数据变量,并且在用户填写了所有参数数据之后,我们从Student类中创建了Object,因此我们需要声明“ SimpleStudentBuilder”类。
Notes :
- 我们需要在学生类中声明该类“ SimpleStudentBuilder”的内部,因为我们需要将“学生构造函数”更改为私有类和内部类,然后才能从“学生”中初始化新对象。我们还需要声明“ SimpleStudentBuilder”静态,因为我们可以从外部类使用它,而不能从学生使用init对象:)
SimpleStudentBuilder 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存储库中显示完整的代码。
Usage SimpleStudentBuilder :
公共静态void main(String [] args){
Student student = new Student.SimpleStudentBuilder()
.setMajor("IT")
.setName("Kareem Radwa")
.setMobileNumber("0597190510")
.setSalary(1000)
.setId(32)
.build();
}
Deep In Builder Design Patter :)
假设在Student Constructor中,我们优先传递参数值,例如按[id,name,major,mobile number]的顺序传递。如果这种安排消失了,您将无法从Student类创建对象。
因此,我们需要针对这种情况做出答案,答案是Step Builder,但是如何实现此答案。 继续阅读 :)
Step Builder Design Patter :
要应用这个想法,您需要
许多接口具有相同数量的Require变量,因此在我们的示例Student类中,我们需要4个接口,此外,我们还需要一个用于Build Method和可选变量的接口。 以上所有接口均已实现类,我们需要在“步骤”中添加标题
The explanation for Usage StudentStepBuilder:
当我们需要使用这种生成器方法时,您需要仅显示第一次id设置方法,如果用户对其进行过滤,则可以在此之后设置Name变量值,等等。
Time Of coding:
公共课程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;
}
}
}
Usage StudentStepBuilder:
Result of Step Builder Design Pattern
all code in GitHub repository: link
Finally
这是我的第一篇文章。 祝您阅读愉快。