概述
建造者模式,顾名思义,也是创建对象实例的一种方式。当一个Java对象中存在多个类型相同熟悉,或者Java对象的实例化的过程比较复杂时,推荐使用使用建造者模式来构建对象。
当Java对象的属性在4个以上,且构建实例需要四个以上相同类型参数时。如果使用构造方法的方式去实例化一个对象。这样的代码很容易难读。如果在构造器中写错了参数的位置。编译器是不会报错的。这样很容易产生错误的结果!
public class Student implements Serializable {
private static final long serialVersionUID = -8225932046111829934L;
private String id ;
private String name ;
private String school ;
private String clazz ;
private String studentNum ;
private Integer age ;
private String tel ;
private String address ;
public Student() {
}
public Student(String id, String name, String school, String clazz, String studentNum, Integer age, String tel, String address) {
this.id = id;
this.name = name;
this.school = school;
this.clazz = clazz;
this.studentNum = studentNum;
this.age = age;
this.tel = tel;
this.address = address;
}
}
如上所示。我们在构造这个学生实例时。由于大部分的属性都是String,因此在填充构造方法参数时,填错了参数的顺序,编译器是不会报错的。但实际结果就错了。
在实际情况中,我们还会经常去使用JavaBean的方式去实例化对象。先调用无参构造器创建一个实例。然后调用setter方法去为每一个属性赋值。
Student student = new Student();
student.setId(UUID.randomUUID().toString());
student.setName("zhangsan");
student.setSchool("wuhanshidiyixiaoxue");
student.setClazz("1年级1班");
student.setAge(6);
student.setStudentNum("20200001");
student.setAddress(".....");
这样虽然能解决构造器创建对象实例中参数赋值混乱的问题,使代码的可读性变强。但是。这样的方式将类的创建过程分成了n个步骤。既无法校验参数必须性。又会存在线程安全的问题。
这就引出来了建造者设计模式。能保证像构造器方式那么安全,又能像JavaBean方式那样的可读性。
实现如下:
public class Student implements Serializable {
private static final long serialVersionUID = -8225932046111829934L;
/**
* id必填
*/
private String id ;
/**
* 名字必填
*/
private String name ;
private String school ;
private String clazz ;
private String studentNum ;
private Integer age ;
public Student() {
}
public Student(Builder builder) {
this.id = builder.id;
this.name = builder.name;
this.school = builder.school;
this.clazz = builder.clazz;
this.studentNum = builder.studentNum;
this.age = builder.age;
}
public static class Builder{
private String id ;
private String name ;
private String school ;
private String clazz ;
private String studentNum ;
private Integer age ;
public Builder(String id,String name){
this.id = id ;
this.name = name ;
}
public Builder school(String school){
this.school = school ;
return this ;
}
public Builder clazz(String clazz){
this.clazz = clazz ;
return this ;
}
public Builder studentNum(String studentNum){
this.studentNum = studentNum ;
return this ;
}
public Builder age(Integer age){
this.age = age ;
return this ;
}
public Student builder(){
return new Student(this);
}
}
@Override
public String toString() {
return "Student{" +
"id='" + id + ''' +
", name='" + name + ''' +
", school='" + school + ''' +
", clazz='" + clazz + ''' +
", studentNum='" + studentNum + ''' +
", age=" + age +
'}';
}
}
测试:
public static void main(String[] args) {
Student student = new Builder("100001", "张三").school("湖北省第一小学")
.clazz("一年级1班")
.studentNum("12345")
.age(6)
.build();
System.out.println(student);
}
}
输出:
Student{id='100001', name='张三', school='湖北省第一小学', clazz='一年级1班', studentNum='12345', age=6}
在spring的源码中就存在很多使用建造者模式的地方,最典型的就是spring boot中的SpringApplicationBuilder。负责构建SpringApplication实例。有兴趣的可以去研究一下源码。实现的思想都是一样的。
最后
以上就是糟糕柚子为你收集整理的你还不懂设计模式? - 建造者模式的全部内容,希望文章能够帮你解决你还不懂设计模式? - 建造者模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复