栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

一起走进建造者模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一起走进建造者模式

一.介绍

建造者模式(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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/657836.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号