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

java23种设计模式-建造者模式

建造者模式(Builder Pattern)学习笔记

1. 模式定义

建造者模式是一种创建型设计模式,通过分步构建复杂对象的方式,将对象的构建过程与表示分离。允许使用相同的构建过程创建不同的对象表示。

2. 适用场景

✅ 需要创建包含多个部件的复杂对象

✅ 需要控制对象的创建过程(分步骤构建)

✅ 需要构建不同表示的对象(相同构建过程不同实现)

✅ 希望避免构造器参数过多(解决"伸缩构造函数"问题)

3. 模式结构

Director
-builder: Builder
+construct()
«interface»
Builder
+buildPartA()
+buildPartB()
+getResult()
ConcreteBuilder
-product: Product
+buildPartA()
+buildPartB()
+getResult()
Product
+partA
+partB
+show()

4. 核心角色

角色说明
Director指挥者,控制构建过程(非必须)
Builder抽象建造者,定义构建步骤的接口
ConcreteBuilder具体建造者,实现构建步骤并返回产品
Product最终构建的复杂对象

5. 代码示例

5.1 产品类

public class Computer {
    private String cpu;
    private String ram;
    private String storage;
    
    // 构造函数、getters、toString...
}

5.2 抽象建造者

public interface ComputerBuilder {
    void buildCPU();
    void buildRAM();
    void buildStorage();
    Computer getResult();
}

5.3 具体建造者

public class GamingComputerBuilder implements ComputerBuilder {
    private Computer computer = new Computer();

    @Override
    public void buildCPU() {
        computer.setCpu("Intel i9-13900K");
    }

    @Override
    public void buildRAM() {
        computer.setRam("64GB DDR5");
    }

    @Override
    public void buildStorage() {
        computer.setStorage("2TB NVMe SSD");
    }

    @Override
    public Computer getResult() {
        return computer;
    }
}

5.4 指挥者(可选)

public class Director {
    private ComputerBuilder builder;

    public Director(ComputerBuilder builder) {
        this.builder = builder;
    }

    public Computer construct() {
        builder.buildCPU();
        builder.buildRAM();
        builder.buildStorage();
        return builder.getResult();
    }
}

5.5 客户端调用

public class Client {
    public static void main(String[] args) {
        ComputerBuilder builder = new GamingComputerBuilder();
        Director director = new Director(builder);
        Computer computer = director.construct();
        
        // 或直接使用建造者
        ComputerBuilder builder2 = new OfficeComputerBuilder();
        builder2.buildCPU();
        builder2.buildRAM();
        Computer simpleComputer = builder2.getResult();
    }
}

6. 模式变种

  1. 链式调用版
public class Computer {
    // 使用静态内部类实现
    public static class Builder {
        private String cpu;
        private String ram;
        
        public Builder withCPU(String cpu) {
            this.cpu = cpu;
            return this;
        }
        
        public Builder withRAM(String ram) {
            this.ram = ram;
            return this;
        }
        
        public Computer build() {
            return new Computer(this);
        }
    }
}
// 使用:new Computer.Builder().withCPU("i7").withRAM("16GB").build();

7. 优缺点分析

✔️ 优点

  • 分离构建过程和表示
  • 更好的控制构建过程
  • 方便扩展新的产品类型
  • 避免过多构造函数参数

缺点

  • 增加代码复杂度
  • 产品需要高度相似才适用
  • 对简单对象的创建可能显得冗余

8. 相关模式对比

模式关注点复杂度使用场景
工厂模式对象整体创建创建单一类型对象
抽象工厂模式产品族的创建创建相关对象家族
建造者模式分步构建复杂对象需要分步骤构建的复杂对象

9. 实际应用案例

  • Java中的StringBuilder
  • Spring中的BeanDefinitionBuilder
  • Lombok的@Builder注解实现
  • Android中的AlertDialog.Builder

10. 最佳实践建议

  1. 当构造器参数超过4个时考虑使用
  2. 需要创建不可变对象时优先使用
  3. 使用链式调用增强可读性
  4. 当构建顺序重要时一定要保留Director角色

📌 记忆技巧:把建造者模式想象成"分步填表"的过程,最后提交表格生成完整对象。


文章转载自:

http://GE8mhI9B.ysybx.cn
http://OupV0uXH.ysybx.cn
http://9NzjoCmm.ysybx.cn
http://FOPGTiGW.ysybx.cn
http://JcjsozeM.ysybx.cn
http://nebU9l3b.ysybx.cn
http://CKm1Jd0Q.ysybx.cn
http://DPEpAHAh.ysybx.cn
http://lEUY94qJ.ysybx.cn
http://pxts0x44.ysybx.cn
http://zwoeZZFI.ysybx.cn
http://QNfK7fWy.ysybx.cn
http://2iGz8X8Q.ysybx.cn
http://KWupKIFU.ysybx.cn
http://nD687E72.ysybx.cn
http://CHtQ4lyu.ysybx.cn
http://EQSsIYJF.ysybx.cn
http://xN6DbP9C.ysybx.cn
http://I7SEHU7o.ysybx.cn
http://xYU1BCDz.ysybx.cn
http://EKxra42d.ysybx.cn
http://GvWQf6OG.ysybx.cn
http://NS6AFXU3.ysybx.cn
http://ZG0HlJEI.ysybx.cn
http://gEkEB0Rt.ysybx.cn
http://AdbuKoYD.ysybx.cn
http://OUM3pXSi.ysybx.cn
http://iJ6nj2G1.ysybx.cn
http://rQaBTP9n.ysybx.cn
http://Cq0aaJ4V.ysybx.cn
http://www.dtcms.com/a/36282.html

相关文章:

  • 基于keepalived实现haproxy高可用站点
  • Ansible剧本-playbook
  • 在 JavaScript 中如何定义一个对象
  • 论文笔记:Scaling Sentence Embeddings with Large Language Models
  • 如何在 Vue 项目中为 `el-pagination` 设置中文
  • Sky Hackathon 清水湾的水 AI美食助手
  • 一键快速打包提交发布命令行工具
  • 【报错解决】vue打开界面报错Uncaught SecurityError: Failed to construct ‘WebSocket‘
  • zabbix排障-zabbix监控的主机出现可用性灰色或者红色问题
  • 欢乐力扣:快乐数
  • MySQL 8.0 社区版安装与配置全流程指南(Windows平台)
  • linux-多进程基础(1) 程序、进程、多道程序、并发与并行、进程相关命令,fork
  • 详细解析d3dx9_27.dll丢失怎么办?如何快速修复d3dx9_27.dll
  • 四元数 欧拉角
  • 【AI+智造】DeepSeek价值重构:当采购与物控遇上数字化转型的化学反应
  • 【SpringBoot】【JWT】0.12.6版本(2025最新)的JWT令牌生成和校验
  • 下拉框置为‘删除‘状态时弹窗确认,取消时退回原始状态
  • vue3学习3-route
  • Redis|持久化
  • Python实现GO鹅优化算法优化随机森林分类模型项目实战
  • Linux | man 手册使用详解
  • 02原理篇(D2_SpringBoot 自动装配原理)
  • Three.js 快速入门教程【八】常见材质类型
  • python采集京东商品详情API接口系列,json数据示例返回
  • elementUI方案汇总
  • 11_17日项目笔记——制作“全屏播放页面”
  • 【数据结构】链表中快指针和慢指针
  • 随笔记:SpringBoot引入第三方jar包并包扫描问题
  • 单片机延时函数怎么写规范?
  • 甘肃非物质文化网站(源码+数据库+文档)