当前位置: 首页 > news >正文

建造者模式(创建型)

目录

一、前言

二、建造者模式

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

四、总结


一、前言

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

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

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

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

        整个建造者模式的类图:

        

二、建造者模式

        首先建立Product类:

public class Product {private String part1;private String part2;private String part3;private String part4;public void setPart1(String part1) {this.part1 = part1;}public void setPart2(String part2) {this.part2 = part2;}public void setPart3(String part3) {this.part3 = part3;}public void setPart4(String part4) {this.part4 = part4;}@Overridepublic String toString() {return "Product{" +"part1='" + part1 + '\'' +", part2='" + part2 + '\'' +", part3='" + part3 + '\'' +", part4='" + part4 + '\'' +'}';}
}

        创建抽象的Builder类:

public abstract class Builder {public abstract void buildPart1(String part1);public abstract void buildPart2(String part2);public abstract void buildPart3(String part3);public abstract void buildPart4(String part4);public abstract Product getProduct();
}

        创建具体的建造者类ConcreteBuilder:

public class ConcreteBuilder extends Builder{private Product product = new Product();@Overridepublic void buildPart1(String part1) {product.setPart1(part1);}@Overridepublic void buildPart2(String part2) {product.setPart2(part2);}@Overridepublic void buildPart3(String part3) {product.setPart3(part3);}@Overridepublic void buildPart4(String part4) {product.setPart4(part4);}@Overridepublic Product getProduct() {return product;}
}

        指挥者类Director:

public 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.getProduct();}
}

        进行测试:

public class TestBuilder {public static void main(String[] args) {Builder builder = new ConcreteBuilder();Director director = new Director(builder);director.construct("part1", "part2");builder.buildPart3("part3");Product product = builder.getProduct();System.out.println(product);}
}

        运行结果:

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

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

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

public class Product {private String part1;private String part2;private String part3;private String part4;public Product(ConcreteBuilder concreteBuilder) {this.part1 = concreteBuilder.part1;this.part2 = concreteBuilder.part2;this.part3 = concreteBuilder.part3;this.part4 = concreteBuilder.part4;}@Overridepublic String toString() {return "Product{" +"part1='" + part1 + '\'' +", part2='" + part2 + '\'' +", part3='" + part3 + '\'' +", part4='" + part4 + '\'' +'}';}public static class ConcreteBuilder {private String part1;private String part2;private String part3;private String part4;public ConcreteBuilder(String part1, String part2){this.part1 = part1;this.part2 = part2;}public ConcreteBuilder builderPart3(String part3) {this.part3 = part3;return this;}public ConcreteBuilder builderPart4(String part4) {this.part4 = part4;return this;}public Product build() {return new Product(this);}}}

        最后编写调用类:

public class TestBuilder {public static void main(String[] args) {Product product = new Product.ConcreteBuilder("part1", "part2").builderPart4("part4").build();System.out.println(product);}
}

        运行结果:

四、总结

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

        实际使用的代码中,比如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的构建过程更加灵活,易于使用和扩展。同时,建造者模式将对象构建的过程和具体实现分离开来,使得代码更加清晰简洁

相关文章:

  • 网络安全-学习手册
  • 蓝牙耳机仓设计的单芯片解决方案
  • 信息的浏览
  • 002.文件管理
  • MongoDB备份与恢复以及导入导出
  • C#中数组、ArrayList与List对象的区别及使用场景
  • Windows系统中搭建docker (ubuntu,Docker-desktop)
  • JUNIT使用和注意、以及断言的介绍使用、SpringBoot Test测试类的使用、maven配置使用junit详细介绍
  • pipeline + node +jenkins+kubernetes部署yarn前端项目
  • V10 桌面版、服务器版系统加固
  • WhatsApp账号被封?看看是不是你的原因!
  • 释放生成式AI的巨大潜力,德勤中国与亚马逊云科技共建生成式AI联合实验室
  • Windows 安装 汉化版 burp suite
  • CC攻击的前身
  • 2023.11.17-hive调优的常见方式
  • [PHP内核探索]PHP中的哈希表
  • C++11: atomic 头文件
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • JWT究竟是什么呢?
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Promise初体验
  • Spring Cloud Feign的两种使用姿势
  • 记录:CentOS7.2配置LNMP环境记录
  • 经典排序算法及其 Java 实现
  • MPAndroidChart 教程:Y轴 YAxis
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (1)(1.9) MSP (version 4.2)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (层次遍历)104. 二叉树的最大深度
  • (待修改)PyG安装步骤
  • (二)斐波那契Fabonacci函数
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (力扣)循环队列的实现与详解(C语言)
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (四)c52学习之旅-流水LED灯
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • .net 使用ajax控件后如何调用前端脚本
  • .net开发时的诡异问题,button的onclick事件无效
  • ::
  • ;号自动换行
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [ C++ ] STL_list 使用及其模拟实现
  • [51nod1610]路径计数
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [Android] Upload package to device fails #2720
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [BZOJ4016][FJOI2014]最短路径树问题
  • [C++提高编程](三):STL初识
  • [docker] Docker的私有仓库部署——Harbor
  • [Flex] PopUpButton系列 —— 控制弹出菜单的透明度、可用、可选择状态
  • [HarekazeCTF2019]encode_and_encode 不会编程的崽
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器