高级生成器设计模式— Java

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

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

Medium:

from: https://dev.to//kareemradwan/advance-builder-design-pattern-java-3pab

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值