Java创建型模式之建造者模式详解
一.介绍
建造者模式(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支持容器的自动配置,默认是Tomcat,当然我们也是可以进行修改的。这篇文章给大家介绍了spring boot开发遇到坑之spring-boot-starter-web配置文件使用教程,需要的朋友参考下吧2018-01-01
Spring Boot中使用 Spring Security 构建权限系统的示例代码
本篇文章主要介绍了Spring Boot中使用 Spring Security 构建权限系统的示例代码,具有一定的参考价值,有兴趣的可以了解一下2017-08-08
了解spring中的CloudNetflix Hystrix弹性客户端
这篇文章主要介绍了了解spring中的CloudNetflix Hystrix弹性客户端,客户端弹性模式是在远程服务发生错误或表现不佳时保护远程资源(另一个微服务调用或者数据库查询)免于崩溃。,需要的朋友可以参考下2019-06-06
TransmittableThreadLocal通过javaAgent实现线程传递并支持ForkJoin
这篇文章主要介绍了TransmittableThreadLocal通过javaAgent实现线程传递并支持ForkJoin详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-06-06


最新评论