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
}
相关推荐
牛马baby21 分钟前
Springboot 自动装配原理是什么?SPI 原理又是什么?
java·spring boot·后端
小小深42 分钟前
了解JVM
java·jvm
Sunlight_7771 小时前
第五章 SQLite数据库:1、SQLite 基础语法及使用案例
java·linux·服务器·jvm·数据库·tcp/ip·sqlite
JhonKI1 小时前
【从零实现高并发内存池】内存池整体框架设计 及 thread cache实现
java·redis·缓存
何似在人间5751 小时前
SpringAI+DeepSeek大模型应用开发——4 对话机器人
java·机器人·大模型应用开发·spring ai
-曾牛2 小时前
【LangChain4j快速入门】5分钟用Java玩转GPT-4o-mini,Spring Boot整合实战!| 附源码
java·开发语言·人工智能·spring boot·ai·chatgpt
kfepiza2 小时前
HttpSessionListener 的用法笔记250417
java·笔记·servlet·tomcat
冬天vs不冷2 小时前
SpringBoot条件注解全解析:核心作用与使用场景详解
java·spring boot·python
百锦再2 小时前
Android Studio 实现自定义全局悬浮按钮
android·java·ide·app·android studio·安卓
百锦再2 小时前
Android Studio 项目文件夹结构详解
android·java·ide·ios·app·android studio·idea