所有分类
  • 所有分类
  • 未分类

建造者模式Java实战

简介

说明

本文用Java实战来介绍建造者模式的写法,让你彻底掌握建造者模式。

建造者模式的优点

建造者模式可以为构建对象提供如下便利:

  1. 可以只指定某几个属性。
  2. 可以肉眼可见地给某个属性赋值,不需要再点进去看构造方法的定义。

实战

需求:构建一个User对象。

原始写法

用户实体类

package com.knife.designPattern.entity;

import lombok.Data;

/**
 * 用户实体类
 */
@Data
public class User {
    private String username;

    private String email;

    private String phone;

    public User(String username, String email, String phone) {
        this.username = username;
        this.email = email;
        this.phone = phone;
    }
}

测试类

package com.knife.designPattern;


import com.knife.designPattern.entity.User;

public class Test {
    public static void main(String[] args) {
        User user = new User("钢铁侠", "aa@gmail.com", "111222333");

        System.out.println(user);
    }
}

可以发现,创建一个User对象时,会遇到如下问题:

  1. 参数都是String,我都不知道第一个参数是什么含义,第二个是什么,必须点进来看看这个方法定义。参数少还好,参数是十个呢?二十个呢?头都大了
  2. 我想只指定其中的2个参数:邮箱和电话号码。我还是要去看看这个方法定义,还得给第1个参数指定为null。同样地,参数很多时会很麻烦。

测试结果

User(username=钢铁侠, email=aa@gmail.com, phone=111222333)

手写建造者

用户实体类

package com.knife.designPattern.entity;

import lombok.Data;

/**
 * 用户实体类
 */
@Data
public class User {
    private String username;

    private String email;

    private String phone;
 
    public static UserBuilder builder() {
        return new UserBuilder();
    }
}

可以发现,用户实体类里持有一个用户建造者。

用户建造者

package com.knife.designPattern.entity;
 
public class UserBuilder {
    private final User user;
 
    public UserBuilder() {
        this.user = new User();
    }
 
    public UserBuilder username(String username) {
        user.setUsername(username);
        return this;
    }
 
    public UserBuilder email(String email) {
        user.setEmail(email);
        return this;
    }
 
    public UserBuilder phone(String phone) {
        user.setPhone(phone);
        return this;
    }
 
    public User build() {
        return user;
    }
}

每一个赋值方法都只设置一个属性,然后返回User这个实体类。

测试类

package com.knife.designPattern;


import com.knife.designPattern.entity.User;

public class Test {
    public static void main(String[] args) {
        User user = User.builder()
                .email("aa@gmail.com")
                .phone("111222333")
                .build();

        System.out.println(user);
    }
}

可以发现,建造者模式这种写法有如下优点:

  1. 可以只指定某几个属性(本处只指定了邮箱和电话)
  2. 可以肉眼可见地给某个属性赋值,不需要再点进去看构造方法的定义。

测试结果

User(username=null, email=aa@gmail.com, phone=111222333)

用lombok生成建造者

建造者模式这么简单,就是写一个builder,里边给实体类的每个属性赋值,然后返回这个实体类对象本身。那么有没有什么简便方法?一个一个手写也太麻烦了!
答案是:有的!

lombok可以自动生成Builder,方法是:在实体类上加个@Builder即可。

实体类

package com.knife.designPattern.entity;

import lombok.Builder;
import lombok.Data;

/**
 * 用户
 */
@Builder
@Data
public class User {
    private String username;

    private String email;

    private String phone;
 
}

测试类

package com.knife.designPattern;


import com.knife.designPattern.entity.User;

public class Test {
    public static void main(String[] args) {
        User user = User.builder()
                .username("钢铁侠")
                .email("aa@gmail.com")
                .build();

        System.out.println(user);
    }
}

测试结果

User(username=钢铁侠, email=aa@gmail.com, phone=null)

怎么样?@Builder是不是超级好用!

0

评论2

请先

  1. 除了实体类,还可以如何用
    珠光2023 2023-09-11 0
    • 其他地方用的就极少了,我甚至都想不起来。它本质是一个创建型类型的设计模式,一般就是用于实体类的创建的。
      自学精灵 2023-09-11 0
显示验证码
没有账号?注册  忘记密码?

社交账号快速登录