Java创建型模式之建造者模式详解

 更新时间:2023年02月17日 15:45:28   作者:非凡的小笨鱼  
建造者模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。本文将通过示例讲解建造者模式,需要的可以参考一下

一.介绍

建造者模式(Builder Pattern)属于创建型模式。如果一个对象具有复杂的内部结构或者内部属性本身相互依赖(有顺序要求),甚至对象中的某些属性的创建也有一个很复杂的过程,就可以使用建造者模式

二.UML类图

三.具体代码

业务代码

public class Product {
    private String part1;
    private String part2;
    public Product(String part1, String part2) {
        this.part1 = part1;
        this.part2 = part2;
    }
    @Override
    public String toString() {
        return "Product{" +
                "part1='" + part1 + '\'' +
                ", part2='" + part2 + '\'' +
                '}';
    }
}
//控制每个部件的具体创建
interface Builder {
    void buildPart1(String part1);
    void buildPart2(String part2);
    Product build();
}
class ChinaBuilder implements Builder{
    private String part1;
    private String part2;
    @Override
    public void buildPart1(String part1) {
        this.part1 = "国产" + part1;
    }
    @Override
    public void buildPart2(String part2) {
         this.part2 = "国产" + part2;
    }
    @Override
    public Product build() {
        return new Product(part1, part2);
    }
}
//控制组装部件的顺序
class Director{
    private Builder builder;
    public Director(Builder builder) {
        this.builder = builder;
    }
    public Product construct(String part1, String part2){
        builder.buildPart1(part1);
        builder.buildPart2(part2);
        return builder.build();
    }
}

测试代码

public class BuilderTest {
    public static void main(String[] args) {
        Director director = new Director(new ChinaBuilder());
        Product product = director.construct("传感器", "芯片");
        System.out.println(product); //Product{part1='国产传感器', part2='国产芯片'}
    }
}

四.lombok的@Builder注解(拓展)

我们先以静态内部类的方式实现简单场景下的建造者模式(以优雅的链式调用代替set)

业务代码

public class Product {
    private String part1;
    private String part2;
    public Product(String part1, String part2) {
        this.part1 = part1;
        this.part2 = part2;
    }
    @Override
    public String toString() {
        return "Product{" +
                "part1='" + part1 + '\'' +
                ", part2='" + part2 + '\'' +
                '}';
    }
    static class Builder {
        private String part1;
        private String part2;
        public Builder part1(String part1) {
            this.part1 = part1;
            return this;
        }
        public Builder part2(String part2) {
            this.part2 = part2;
            return this;
        }
        public Product build(){
            return new Product(part1, part2);
        }
    }
}

测试类

public class ProductTest {
    public static void main(String[] args) {
        Product product = new Product.Builder().part1("传感器").part2("芯片").build();
        System.out.println(product); //Product{part1='传感器', part2='芯片'}
    }
}

下面看看lombok的@Builder注解的实现

业务代码

@Builder
public class Product {
    private String part1;
    private String part2;
}

在IDEA中打开Product.class文件,可以看出实际就是使用的简单场景的建造者模式

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.designpattern.create.builder.lombok;
public class Product {
    private String part1;
    private String part2;
    Product(String part1, String part2) {
        this.part1 = part1;
        this.part2 = part2;
    }
    public static Product.ProductBuilder builder() {
        return new Product.ProductBuilder();
    }
    public static class ProductBuilder {
        private String part1;
        private String part2;
        ProductBuilder() {
        }
        public Product.ProductBuilder part1(String part1) {
            this.part1 = part1;
            return this;
        }
        public Product.ProductBuilder part2(String part2) {
            this.part2 = part2;
            return this;
        }
        public Product build() {
            return new Product(this.part1, this.part2);
        }
        public String toString() {
            return "Product.ProductBuilder(part1=" + this.part1 + ", part2=" + this.part2 + ")";
        }
    }
}

五.在Spring中的应用

org.springframework.web.servlet.mvc.method.RequestMappingInfo.DefaultBuilder

到此这篇关于Java创建型模式之建造者模式详解的文章就介绍到这了,更多相关Java建造者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring boot开发遇到坑之spring-boot-starter-web配置文件使用教程

    spring boot开发遇到坑之spring-boot-starter-web配置文件使用教程

    Spring Boot支持容器的自动配置,默认是Tomcat,当然我们也是可以进行修改的。这篇文章给大家介绍了spring boot开发遇到坑之spring-boot-starter-web配置文件使用教程,需要的朋友参考下吧
    2018-01-01
  • 超细讲解Java调用python文件的几种方式

    超细讲解Java调用python文件的几种方式

    有时候我们在写java的时候需要调用python文件,下面这篇文章主要给大家介绍了关于Java调用python文件的几种方式,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Spring Boot中使用 Spring Security 构建权限系统的示例代码

    Spring Boot中使用 Spring Security 构建权限系统的示例代码

    本篇文章主要介绍了Spring Boot中使用 Spring Security 构建权限系统的示例代码,具有一定的参考价值,有兴趣的可以了解一下
    2017-08-08
  • SpringSecurity添加图形验证码认证实现

    SpringSecurity添加图形验证码认证实现

    本文主要介绍了SpringSecurity添加图形验证码认证实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 消息中间件ActiveMQ的简单入门介绍与使用

    消息中间件ActiveMQ的简单入门介绍与使用

    消息队列是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成,这篇文章主要给大家介绍了关于ActiveMQ的简单入门介与使用的相关资料,需要的朋友可以参考下
    2021-11-11
  • 轻松掌握Java备忘录模式

    轻松掌握Java备忘录模式

    这篇文章主要帮助大家轻松掌握Java备忘录模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 了解spring中的CloudNetflix Hystrix弹性客户端

    了解spring中的CloudNetflix Hystrix弹性客户端

    这篇文章主要介绍了了解spring中的CloudNetflix Hystrix弹性客户端,客户端弹性模式是在远程服务发生错误或表现不佳时保护远程资源(另一个微服务调用或者数据库查询)免于崩溃。,需要的朋友可以参考下
    2019-06-06
  • Java实战员工绩效管理系统的实现流程

    Java实战员工绩效管理系统的实现流程

    只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+Mysql+Maven+HTML实现一个员工绩效管理系统,大家可以在过程中查缺补漏,提升水平
    2022-01-01
  • 浅谈MySQL中是如何实现事务提交和回滚的

    浅谈MySQL中是如何实现事务提交和回滚的

    本文主要介绍了MySQL中是如何实现事务提交和回滚的,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • TransmittableThreadLocal通过javaAgent实现线程传递并支持ForkJoin

    TransmittableThreadLocal通过javaAgent实现线程传递并支持ForkJoin

    这篇文章主要介绍了TransmittableThreadLocal通过javaAgent实现线程传递并支持ForkJoin详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06

最新评论