• 建造者模式(创建型)


    目录

    一、前言

    二、建造者模式

    三、链式编程实现建造者模式

    四、总结


    一、前言

            当我们开发一个软件应用时,我们通常需要创建各种对象。有些对象是简单的,可以直接实例化,但有些对象则比较复杂,需要多个步骤才能创建完成。这时候,建造者模式就派上用场了。        

            建造者模式是一种创建型设计模式,它允许我们逐步构造一个复杂的对象,而且可以控制整个构造过程。

            建造者模式中有四个重要的角色:

    产品(Product):表明需要构建的产品对象
    抽象建造者(Builder):抽象出来的构建者类,用于定义创建对象所需的步骤以及创建的步骤的调用过程
    具体建造者(ConcreteBuilder):抽象建造者的具体实现,对于不同的创建过程可以用不同的类进行实现
    指挥者(Director):使用 Builder 的类,提供给调用方使用,调用方通过使用指挥者来获取产品

            整个建造者模式的类图:

            

    二、建造者模式

            首先建立Product类:

    1. public class Product {
    2. private String part1;
    3. private String part2;
    4. private String part3;
    5. private String part4;
    6. public void setPart1(String part1) {
    7. this.part1 = part1;
    8. }
    9. public void setPart2(String part2) {
    10. this.part2 = part2;
    11. }
    12. public void setPart3(String part3) {
    13. this.part3 = part3;
    14. }
    15. public void setPart4(String part4) {
    16. this.part4 = part4;
    17. }
    18. @Override
    19. public String toString() {
    20. return "Product{" +
    21. "part1='" + part1 + '\'' +
    22. ", part2='" + part2 + '\'' +
    23. ", part3='" + part3 + '\'' +
    24. ", part4='" + part4 + '\'' +
    25. '}';
    26. }
    27. }

            创建抽象的Builder类:

    1. public abstract class Builder {
    2. public abstract void buildPart1(String part1);
    3. public abstract void buildPart2(String part2);
    4. public abstract void buildPart3(String part3);
    5. public abstract void buildPart4(String part4);
    6. public abstract Product getProduct();
    7. }

            创建具体的建造者类ConcreteBuilder:

    1. public class ConcreteBuilder extends Builder{
    2. private Product product = new Product();
    3. @Override
    4. public void buildPart1(String part1) {
    5. product.setPart1(part1);
    6. }
    7. @Override
    8. public void buildPart2(String part2) {
    9. product.setPart2(part2);
    10. }
    11. @Override
    12. public void buildPart3(String part3) {
    13. product.setPart3(part3);
    14. }
    15. @Override
    16. public void buildPart4(String part4) {
    17. product.setPart4(part4);
    18. }
    19. @Override
    20. public Product getProduct() {
    21. return product;
    22. }
    23. }

            指挥者类Director:

    1. public class Director {
    2. private Builder builder;
    3. public Director(Builder builder) {
    4. this.builder = builder;
    5. }
    6. public Product construct(String part1, String part2) {
    7. builder.buildPart1(part1);
    8. builder.buildPart2(part2);
    9. return builder.getProduct();
    10. }
    11. }

            进行测试:

    1. public class TestBuilder {
    2. public static void main(String[] args) {
    3. Builder builder = new ConcreteBuilder();
    4. Director director = new Director(builder);
    5. director.construct("part1", "part2");
    6. builder.buildPart3("part3");
    7. Product product = builder.getProduct();
    8. System.out.println(product);
    9. }
    10. }

            运行结果:

            这里我是假设其中part1、part2是必须传的参数,其余两个参数非必传。

    三、链式编程实现建造者模式

            链式编程中,我们只需要创建一个Product类,然后在里面创建静态的ConcreteBuilder类,并创建一个构造方法:

    1. public class Product {
    2. private String part1;
    3. private String part2;
    4. private String part3;
    5. private String part4;
    6. public Product(ConcreteBuilder concreteBuilder) {
    7. this.part1 = concreteBuilder.part1;
    8. this.part2 = concreteBuilder.part2;
    9. this.part3 = concreteBuilder.part3;
    10. this.part4 = concreteBuilder.part4;
    11. }
    12. @Override
    13. public String toString() {
    14. return "Product{" +
    15. "part1='" + part1 + '\'' +
    16. ", part2='" + part2 + '\'' +
    17. ", part3='" + part3 + '\'' +
    18. ", part4='" + part4 + '\'' +
    19. '}';
    20. }
    21. public static class ConcreteBuilder {
    22. private String part1;
    23. private String part2;
    24. private String part3;
    25. private String part4;
    26. public ConcreteBuilder(String part1, String part2){
    27. this.part1 = part1;
    28. this.part2 = part2;
    29. }
    30. public ConcreteBuilder builderPart3(String part3) {
    31. this.part3 = part3;
    32. return this;
    33. }
    34. public ConcreteBuilder builderPart4(String part4) {
    35. this.part4 = part4;
    36. return this;
    37. }
    38. public Product build() {
    39. return new Product(this);
    40. }
    41. }
    42. }

            最后编写调用类:

    1. public class TestBuilder {
    2. public static void main(String[] args) {
    3. Product product = new Product.ConcreteBuilder("part1", "part2")
    4. .builderPart4("part4")
    5. .build();
    6. System.out.println(product);
    7. }
    8. }

            运行结果:

    四、总结

            本文中的示例对象都是比较简单的,实际开发中这种简单的对象创建并不会使用到建造者模式,只有当对象比较复杂的时候才会使用到。

            实际使用的代码中,比如alibaba的Excel操作,com.alibaba.excel.write.builder就使用了建造者模式,ExcelWriterBuilder充当了具体的构建者,该类继承AbstractExcelWriterParameterBuilder。整个的产品就是一个WriteWorkbook对象。

            再比如org.springframework.web.reactive.function.client的WebClient也是使用建造者模式,使用WebClient.Builder类来构建WebClient对象。WebClient.Builder类封装了创建WebClient对象的细节,提供了一系列的方法来设置WebClient的属性,例如设置连接超时时间、设置请求头、设置代理等。最终,WebClient.Builder通过build()方法来返回一个完整的WebClient对象。使用建造者模式可以使得WebClient的构建过程更加灵活,易于使用和扩展。同时,建造者模式将对象构建的过程和具体实现分离开来,使得代码更加清晰简洁

  • 相关阅读:
    【毕业设计】基于超声波智能跟随小车 - 单片机 物联网 stm32 c51
    WSL 的问题记录
    华为OD机试真题-整数对最小和-2023年OD统一考试(C卷)-- Python3-开源
    【c++】如何有效地利用命名空间?
    Decomposed Meta-Learning for Few-Shot Named Entity Recognition
    爆了,阿里架构师手写MySQL数据库指南,带你轻松年入百万
    【C++--string模拟实现】
    【每日一题Day46】LC1796字符串中第二大的数字 | 模拟
    [数据结构]链表OJ题 (三) 链表的中间结点、链表中倒数第k个结点、合并两个有序链表、链表分割、链表的回文结构
    墙面想贴好墙布,这些方法指南一定要看~好佳居窗帘十大品牌
  • 原文地址:https://blog.csdn.net/qq_41061437/article/details/134390762