你还不懂设计模式? - 建造者模式

建造者模式,顾名思义,也是创建对象实例的一种方式。当一个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实例。有兴趣的可以去研究一下源码。实现的思想都是一样的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值