优点
1.建造者独立,易扩展。
2.便于控制细节风险。
缺点
1.产品必须有共同点,范围有限制。
2.如内部变化复杂,会有很多的建造类。
使用场景
1.需要生成的对象具有复杂的内部结构。
2.需要生成的对象内部属性本身相互依赖。
一、实现方式
- package com.asurplus.common.builder.style1;
- public class UserInfo {
- private String name;
- private int age;
- /**
- * 创建一个新的建造者
- *
- * @return
- */
- public static UserInfoBuilder builder() {
- return new UserInfoBuilder();
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- @Override
- public String toString() {
- return "UserInfo{" +
- "name='" + name +
- ", age=" + age +
- '}';
- }
- /**
- * 建造者内部类
- */
- public static class UserInfoBuilder {
- private String name;
- private int age;
- public UserInfoBuilder name(String name) {
- this.name = name;
- return this;
- }
- public UserInfoBuilder age(int age) {
- this.age = age;
- return this;
- }
- /**
- * 创建一个新的实例对象并赋值
- *
- * @return
- */
- public UserInfo build() {
- UserInfo userInfo = new UserInfo();
- userInfo.setName(this.name);
- userInfo.setAge(this.age);
- return userInfo;
- }
- }
- }
我们定义了一个 UserInfo 类,有 name,age 两个属性,还定义了一个静态内部类 UserInfoBuilder,帮助我们建造 UserInfo,并提供链式调用的方法。
二、实现方式
1、引入依赖
- <!-- lombok插件 -->
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <optional>true</optional>
- </dependency>
Lombok 需要在 IDEA 中安装插件,具体方法,请百度。
2、实现
- package com.asurplus.common.builder.style2;
- import lombok.Builder;
- import lombok.Data;
- /**
- * get set toString 方法注解
- */
- @Data
- /**
- * 建造者模式注解
- */
- @Builder
- public class UserInfo2 {
- private String name;
- private int age;
- }
基于 Lombok 的注解,我们省略了大部分代码,但是具体的实现方式和我们的方式一是一模一样的,调用方法也是一样的。
三、测试
- package com.asurplus.common.builder;
- import com.asurplus.common.builder.style1.UserInfo;
- import com.asurplus.common.builder.style2.UserInfo2;
- /**
- * 建造者模式
- */
- public class TestMain {
- public static void main(String[] args) {
- // 手写的方式
- UserInfo userInfo = UserInfo.builder().name("张三").age(20).build();
- System.out.println(userInfo);
- // 注解的方式
- UserInfo2 userInfo2 = UserInfo2.builder().name("李四").age(30).build();
- System.out.println(userInfo2);
- }
- }
输出结果

总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注w3xue的更多内容!