设计模式之构造者模式(lombok + @builder)

1. 概念

建造者模式是设计模式的一种,讲一个复杂对象的构建和他的表示分离,是的同样的构建过程可以创建不同的表示。

这种模式又称为生成器模式,这种类型的设计模式提供一种创建对象的最佳方式。

1、定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
2、主要作用:在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。
3、如何使用:用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
4、解决的问题
(1)、方便用户创建复杂的对象(不需要知道实现过程)
(2)、代码复用性 & 封装性(将对象构建过程和细节进行封装 & 复用)
5、注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序,一般用来创建更为复杂的对象

2. lombok + builder 模式

//带填坑

3. 好处

因为我们构建java bean 的时候,其实就有三种写法。

1. 通过构造函数传参的方式来进行构建(臃肿 不能灵活地只设置某些参数)

2.写很多构造方法。而且容易吧两个属性的参数写错位置等等;(重载很多的构造器,然后可以保证数据的一致性,比较安全)

3.写一堆setter方法,缺点就是够早的过程会被分到几个调用中。构造可以出现不一致的状态。(而且代码很啰嗦)

4.采用builder模式的话,当一个类的参数很多的时候。

(使用javabean模式,调用一个无参的构造器,然后调用setter方法来设置每个必要的参数。但是javabean自身有着严重的缺点,因为构造过程被分到几个调用中,在构造javabean可能处于不一致的状态,类无法仅仅通过检验构造器参数的有效性来保证一致性。也就是set的过程中其实很多时候并不能保证一致性,因为set已经算是分开执行了)

build模式 既能保证像重叠构造器那样的安全,也能实现JavaBean模式那样的可读性。 (不用操心线程)

 

那么bulid模式的步骤:

(1)不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂),得到一个build对象。 
(2)然后让客户端在build对象上调用类似的setter方法来设置每个相关的可选参数, 
(3)最后,客户端调用无参的build方法来生成不可变的对象。这个builder是它构建的静态成员类。
 

上述有点难以理解,那么看看代码就好了~

首先看一下我们自己的项目中的话,定义的不是足够规范的builder

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class DemoBuilder implements Cloneable {

    private String imageBase64;

    public DemoBuilder buildImageBase64(String imageBase64) {
        this.setImageBase64(imageBase64);
        return this;
    }
    
    @Override
    public DemoBuilder clone() throws CloneNotSupportedException {
        return (DemoBuilder) super.clone();
    }
}

这是自己手写的 不够规范的builder~

那么其实思想就是

在构建这个对象的时候就可以用bulider模式~

DemoBuilder demoBuilder = new DemoBuilder().buildImageBase64(""));

类似这样来返回一个builder对象!

但是这样写其实不规范,虽然思想是用链式的把参数一起放进去,setter中每个都返回this对象,

最后应该给一个Bulid的构造函数来返回这个对象。

 

 

参考:

链接:https://www.jianshu.com/p/47329a94f5dc

通过lombok带你读透Builder构建器:

https://www.jianshu.com/p/0d8fc3df3647?from=timeline&isappinstalled=0

### Lombok 中 `@Builder` 和 `@Accessors` 注解详解 #### 使用方法及功能描述 #### @Builder 注解 `@Builder` 是 Lombok 提供的一个强大工具,用于简化对象的创建过程。通过此注解可以在编译时自动生成一个内部静态类 Builder 及其相关的方法,从而实现流畅的 API 设计模式。 当与 `@Data` 结合使用时需要注意添加无参构造函数 (`@NoArgsConstructor`) 和全参构造函数 (`@AllArgsConstructor`) 来确保正常工作[^1]。下面是一个简单的例子展示如何利用 `@Builder` 创建并初始化对象: ```java import lombok.Builder; import lombok.Data; @Data @NoArgsConstructor @AllArgsConstructor @Builder public class Person { private String firstName; private String lastName; } ``` 这样就可以像下面这样轻松地实例化对象了: ```java Person person = Person.builder() .firstName("John") .lastName("Doe") .build(); ``` #### @Accessors 注解 另一方面,`@Accessors` 主要用来定制 getter/setter 方法的行为。比如可以通过设置前缀参数让生成的方法忽略特定前缀字符;也可以开启链式调用特性使得每次 setter 调用返回当前对象本身以便连续赋值操作而不需要额外变量存储中间状态[^3]。 这里有一个具体的案例说明带有前缀配置的 `@Accessors` 如何影响成员变量访问器名称: ```java import lombok.Accessors; import lombok.Getter; import lombok.Setter; @Getter @Setter @Accessors(prefix = "p") class User { private Long pId; private String pName; } // 产生的 Getter/Setter 将会是 getId(), setId(Long), getName(), setName(String) ``` 对于启用链条特性的场景,则有如下写法: ```java import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; @Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) static class EmsUser { private String email; private String mobile; } EmsUser user = new EmsUser().setEmail("example@example.com").setMobile("1234567890"); ``` #### 关键差异比较 | 特性 | @Builder | @Accessors | |--------------------|---------------| | **主要用途** | 构建复杂不可变对象 | 定制 Getters/Setters 行为 | | **链式调用支持** | 自动提供 | 需显式声明 (chain=true) | | **默认值设定** | 支持 | 不直接涉及 | | **性能开销** | 较高(因为引入了额外 builder 类) | 更低 | 综上所述,在选择这两个注解之一之前应该考虑具体需求以及项目上下文中哪个更适合解决问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值