java 设计模式 建造者模式

建造者模式

什么是建造者模式

建造者模式(Builder Pattern)是一种设计模式,属于创建型模式 之一。它的主要目的是通过一步步构建 一个复杂对象 的方式,避免了构造过程中的混乱和复杂性。这个模式通常用于构建一个具有多个属性复杂结构 的对象,可以通过分步设置属性构建对象,而不需要构造函数中传递大量的参数。

在建造者模式中,通常会有:

Product(产品) :最终被构建的复杂对象。
Builder(建造者) :定义了构建产品的步骤,并提供设置各个属性的方法。
Director(导演者) :负责指挥如何构建产品,但不涉及具体构建的细节。
ConcreteBuilder(具体建造者):实现了Builder接口,提供具体的构建过程。

没有特别复杂的场景Director和ConcreteBuilder可以省略

建造者模式的作用:

分离构建和表示:将复杂对象的构建过程和表示分离。使用建造者模式可以让客户端关注如何构建对象,而不需要了解对象的构建细节。

提高代码可读性和可维护性:在构造一个对象时,如果需要设置多个参数,建造者模式可以通过方法链或分步设置来简化代码。

构建具有复杂结构的对象:如果对象的构建过程复杂,具有多个可选的参数或多个步骤,建造者模式非常适用。

灵活性:可以通过不同的建造者来创建不同表示的对象,从而提高灵活性。

示例

手动实现建造者模式

这里假设Person是个复杂的对象,我们给他属性赋值的时候,以前会Person person=new Person(); 然后person.setName()赋值,然后又person.setAge()赋值,这样非常麻烦,这时候就可以使用建造者模式,创建一个建造者, new Person.PersonBuilder() .setName("John").setAge(30).setAddress("123 Main St").build();方式创建对象

java 复制代码
// 复杂的对象:Person类
public class Person {
    private String name;
    private int age;
    private String address;

    // 私有构造函数,防止直接实例化
    private Person(PersonBuilder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.address = builder.address;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getAddress() {
        return address;
    }

    // 建造者:PersonBuilder类,定义了构建过程
    public static class PersonBuilder {
        private String name;
        private int age;
        private String address;

        // 设置name
        public PersonBuilder setName(String name) {
            this.name = name;
            return this;
        }

        // 设置age
        public PersonBuilder setAge(int age) {
            this.age = age;
            return this;
        }

        // 设置address
        public PersonBuilder setAddress(String address) {
            this.address = address;
            return this;
        }

        // 构建Person对象
        public Person build() {
            return new Person(this);
        }
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + ", address='" + address + "'}";
    }
}

建造者模式创建Person对象

java 复制代码
public class Main {
    public static void main(String[] args) {
        // 使用建造者模式创建Person对象
        Person person = new Person.PersonBuilder()
                .setName("John")
                .setAge(30)
                .setAddress("123 Main St")
                .build();

        System.out.println(person); // 输出:Person{name='John', age=30, address='123 Main St'}
    }
}

使用lombok优化

我们使用Lombok来简化建造者模式。通过Lombok的@Builder注解,我们可以省去手动编写建造者类的工作。

java 复制代码
import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class Person {
    private String name;
    private int age;
    private String address;
}

Lombok构建 Person 对象

java 复制代码
public class Main {
    public static void main(String[] args) {
        // 使用Lombok生成的建造者模式创建Person对象
        Person person = Person.builder()
                .name("John")
                .age(30)
                .address("123 Main St")
                .build();

        System.out.println(person); // 输出:Person(name=John, age=30, address=123 Main St)
    }
}

使用@Builder注解,Lombok自动为类生成了一个建造者类,开发者不再需要显式地定义PersonBuilder类。

Lombok还为Person类自动生成了构建器的所有方法(name、age、address),以及build()方法来创建对象。

使用@ToString注解,可以自动生成toString()方法,减少了代码量。

Lombok的 @Builder 注解如何工作?

Lombok注解处理器:当我们在Person类上添加@Builder注解时,Lombok会自动在编译时生成一个静态嵌套类PersonBuilder ,其中包含每个字段的set方法

**build()**方法:@Builder注解还会自动生成一个build()方法,用于构建最终的Person对象。
链式调用:Lombok通过自动生成的set方法实现链式调用,使得可以像手动实现建造者模式那样使用Person.builder().name(...).age(...).address(...).build()的方式来创建对象。

生成的代码

会自动生成一下代码

java 复制代码
public static class PersonBuilder {
    private String name;
    private int age;
    private String address;

    // 为每个字段生成set方法
    public PersonBuilder name(String name) {
        this.name = name;
        return this;
    }

    public PersonBuilder age(int age) {
        this.age = age;
        return this;
    }

    public PersonBuilder address(String address) {
        this.address = address;
        return this;
    }

    // 构建Person对象
    public Person build() {
        return new Person(this);
    }
}

Spring Boot中使用建造者模式的地方

Spring Boot中的ApplicationContext和SpringApplication

Spring Boot的配置文件(application.properties 或 application.yml)

Spring Boot的许多配置项使用建造者模式进行初始化。比如,通过@ConfigurationProperties或者@Value注解来加载配置,并通过建造者模式将配置值赋给Java对象。

例如,在application.properties中:

yaml 复制代码
server:
	port:8080
server:
	servlet:
		context-path:/myapp

对应java对象

java 复制代码
@ConfigurationProperties(prefix = "server")
public class ServerProperties {
    private int port;
    private String contextPath;
    // getter and setter methods
}
相关推荐
渣哥1 小时前
原来 Java 里线程安全集合有这么多种
java
间彧2 小时前
Spring Boot集成Spring Security完整指南
java
间彧2 小时前
Spring Secutiy基本原理及工作流程
java
数据智能老司机3 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
Java水解3 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
数据智能老司机4 小时前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
洛小豆5 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学5 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole6 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊6 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端