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

23种设计模式——构建器模式(Builder Pattern)详解

 ✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏: 设计模式
✨特色专栏: 知识分享
🥭本文内容: 23种设计模式——构建器模式(Builder Pattern)详解
📚 ** ps **  : 阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。


目录

一、背景

二、介绍

三、核心思想

四、组成

五、Java实现示例

六、链式调用

七、构建器模式的优点

八、适用场景


一、背景

构建器模式是我放到第一个讲解的设计模式,为什么呢?因为它是一种特别常见的设计模式,并且相对于同样常见的单例模式,初次看见它会觉得很陌生。

比如下图这段安卓代码,简单几行代码它就能弹出一个登录界面,新人初次见到这种代码可能会感到疑惑。不过没事,我们下面即将讲解!


二、介绍

构建器模式一种创建型设计模式,它允许你分步骤创建复杂对象,使得相同的构建过程可以创建不同的表示。


三、核心思想

构建器模式将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式特别适用于以下场景(以登录界面为例):

  • 对象有多个组成部分或复杂配置选项(比如可以给不同登录界面配置不同名称)

  • 需要创建的对象有不同的表现形式(不同名称,表示自然不同)

  • 对象的创建过程需要分步骤进行(比如除了设置名称,还能设置字体大小等......)


四、组成

  1. ​产品(Product)​​:最终要构建的复杂对象

  2. ​抽象构建器(Builder)​​:定义创建产品各个部件的抽象接口

  3. ​具体构建器(ConcreteBuilder)​​:实现Builder接口,构造和装配产品的各个部件

  4. ​指挥者(Director)​​:构建一个使用Builder接口的对象,控制构建过程


五、Java实现示例

// 1. 产品类
class Computer {private String CPU;private String RAM;private String storage;private String GPU;// 省略getter和setter方法@Overridepublic String toString() {return "Computer{" +"CPU='" + CPU + '\'' +", RAM='" + RAM + '\'' +", storage='" + storage + '\'' +", GPU='" + GPU + '\'' +'}';}
}// 2. 抽象构建器
interface ComputerBuilder {void buildCPU(String cpu);void buildRAM(String ram);void buildStorage(String storage);void buildGPU(String gpu);Computer getResult();
}// 3. 具体构建器
class GamingComputerBuilder implements ComputerBuilder {private Computer computer;public GamingComputerBuilder() {this.computer = new Computer();}@Overridepublic void buildCPU(String cpu) {computer.setCPU(cpu);}@Overridepublic void buildRAM(String ram) {computer.setRAM(ram);}@Overridepublic void buildStorage(String storage) {computer.setStorage(storage);}@Overridepublic void buildGPU(String gpu) {computer.setGPU(gpu);}@Overridepublic Computer getResult() {return computer;}
}// 4. 指挥者
class ComputerDirector {public Computer constructGamingComputer(ComputerBuilder builder) {builder.buildCPU("Intel i9");builder.buildRAM("32GB DDR5");builder.buildStorage("1TB NVMe SSD");builder.buildGPU("NVIDIA RTX 4090");return builder.getResult();}public Computer constructOfficeComputer(ComputerBuilder builder) {builder.buildCPU("Intel i5");builder.buildRAM("16GB DDR4");builder.buildStorage("512GB SSD");return builder.getResult();}
}// 客户端代码
public class BuilderPatternDemo {public static void main(String[] args) {ComputerDirector director = new ComputerDirector();ComputerBuilder builder = new GamingComputerBuilder();Computer gamingComputer = director.constructGamingComputer(builder);System.out.println("Gaming Computer: " + gamingComputer);Computer officeComputer = director.constructOfficeComputer(builder);System.out.println("Office Computer: " + officeComputer);}
}

六、链式调用

现代Java开发中常用的一种变体是使用链式调用(Fluent Interface):

class Computer {private String CPU;private String RAM;private String storage;private String GPU;// 私有构造器private Computer(Builder builder) {this.CPU = builder.CPU;this.RAM = builder.RAM;this.storage = builder.storage;this.GPU = builder.GPU;}public static class Builder {private String CPU;private String RAM;private String storage;private String GPU;public Builder withCPU(String cpu) {this.CPU = cpu;return this;}public Builder withRAM(String ram) {this.RAM = ram;return this;}public Builder withStorage(String storage) {this.storage = storage;return this;}public Builder withGPU(String gpu) {this.GPU = gpu;return this;}public Computer build() {return new Computer(this);}}@Overridepublic String toString() {return "Computer{" +"CPU='" + CPU + '\'' +", RAM='" + RAM + '\'' +", storage='" + storage + '\'' +", GPU='" + GPU + '\'' +'}';}
}// 客户端代码
public class BuilderPatternDemo {public static void main(String[] args) {Computer computer = new Computer.Builder().withCPU("Intel i7").withRAM("16GB").withStorage("512GB SSD").withGPU("NVIDIA GTX 1660").build();System.out.println(computer);}
}

七、构建器模式的优点

  1. ​封装性好​​:客户端不必知道产品内部组成的细节

  2. ​构建过程可控​​:可以精细控制产品的创建过程

  3. ​扩展性好​​:增加新的具体构建器无需修改原有代码

  4. ​解耦​​:将构建过程与产品本身分离


八、适用场景

  1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时

  2. 当构造过程必须允许被构造的对象有不同的表示时

  3. 当需要分步骤创建对象,并且这些步骤可能有不同实现时

构建器模式在Java中广泛应用,例如StringBuilder、Locale.Builder等都是构建器模式的实现。


 最后,

        其它设计模式会陆续更新,希望文章对你有所帮助!

http://www.lryc.cn/news/626599.html

相关文章:

  • Jenkins服务器配置SSH
  • 【Ansible】变量、机密、事实
  • 云计算学习100天-第25天
  • ansible中roles角色是什么意思?
  • 苹果XR芯片介绍
  • 【JavaEE】多线程 -- 定时器
  • GO环境变量中GO111MODULE到底是干啥的?
  • 心路历程-了解网络相关知识
  • 【论文阅读】Multi-metrics adaptively identifies backdoors in Federated Learning
  • Azure 使用记录
  • mapbox高阶,结合threejs(threebox)添加建筑glb模型,添加阴影效果,设置阴影颜色和透明度
  • 通过try-catch判断数据库唯一键字段是否重复
  • linux的内核符号表
  • 【表的操作】
  • 深入理解 Linux 多线程
  • mysql-8.0.37-linux-glibc2.12-x86_64安装
  • 可实现三重空间感知:Ai2 开源具身机器人 AI 模型 MolmoAct
  • 从防抖节流到链表树:编程世界中的抽象优化艺术
  • 23种设计模式——模板方法模式(Template Method Pattern)详解
  • 在一台没联网的机器上,用ollama加载qwen3,14b
  • 遥感机器学习入门实战教程|Sklearn 案例④ :多分类器对比(SVM / RF / kNN / Logistic...)
  • 使用 GraalVM Native Image 将 Spring Boot 应用编译为跨平台原生镜像:完整指南
  • Spring Boot 配置
  • nvidia最新论文:小型语言模型是代理人工智能的未来
  • (5)软件包管理器 yum | Vim 编辑器 | Vim 文本批量化操作 | 配置 Vim
  • 5G-A赋能AR眼镜:毫米级虚实融合的未来已来
  • 开源 AR 眼镜怎么选?OpenGlass ,OSSG,cheApR 分析推荐
  • 给你的Unity编辑器添加实现类似 Odin 的 条件显示字段 (ShowIf/HideIf) 功能
  • 用好 Elasticsearch Ruby 传输层elastic-transport
  • 二维码跳转支付宝、微信小程序二码合一(直接关联、中间页识别跳转)方案