Java中的Builder模式构建对象(Scala,python不需要)

    技术2023-10-12  92

    package com.troila.test; /** * @description * 在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成。那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Builder模式来替代多参数构造函数是一个比较好的实践法则。 我们常常会面临编写一个这样的实现类(假设类名叫BuilderTest),这个类拥有多个构造函数, BuilderTest(String name); BuilderTest(String name, int age); BuilderTest(String name, int age, String address); BuilderTest(String name, int age, int sex, String address); 这样一系列的构造函数主要目的就是为了提供更多的客户调用选择,以处理不同的构造请求。 这种方法很常见,也很有效力,但是它的缺点也很多。 类的作者不得不书写多种参数组合的构造函数,而且其中还需要设置默认参数值,这是一个需要细心而又枯燥的工作。 其次,这样的构造函数灵活性也不高,而且在调用时你不得不提供一些没有意义的参数值,例如,BuilderTest("allen", -1, "BEIJING"),显然年龄为负数没有意义,但是你又不的不这样做,得以符合Java的规范。 如果这样的代码发布后,后面的维护者就会很头痛,因为他根本不知道这个-1是什么含义。 对于这样的情况,就非常适合使用Builder模式。 Builder模式的要点就是通过一个代理来完成对象的构建过程。 这个代理职责就是完成构建的各个步骤,同时它也是易扩展的。 * @author: ZhiWen * @create: 2020-07-03 15:43 **/ public class BuilderTest { //假设这里有比较多的属性 private String name; private Integer age; private Integer sex; private String address; //私有全参构造 private BuilderTest(String name, Integer age, Integer sex, String address) { this.name = name; this.age = age; this.sex = sex; this.address = address; } //只提供get public String getName() { return name; } public Integer getAge() { return age; } public Integer getSex() { return sex; } public String getAddress() { return address; } /*提供创建Builder的静态方法*/ public static BuilderTest.Builder builder(){ return new BuilderTest.Builder(); } //通过一个内部的Builder来完成对象的构建过程 public static class Builder{ private String name; private Integer age; private Integer sex; private String address; //只提供set并返回Builder,可链式编程 public BuilderTest.Builder name(String name) { this.name = name; return this; } public BuilderTest.Builder age(Integer age) { this.age = age; return this; } public BuilderTest.Builder sex(Integer sex) { this.sex = sex; return this; } public BuilderTest.Builder address(String address) { this.address = address; return this; } //构建对象 public BuilderTest build(){ return new BuilderTest(name,age,sex,address); } } } //链式调用,灵活传参 BuilderTest build = BuilderTest.builder().name("zhangsan").sex(1).address("beijing").build(); System.out.println(build.getName()+"\t-->\t"+build.getAddress());

    Lombok插件的@Builder注解可以实现同样的效果

    Processed: 0.010, SQL: 9