【Java中23种面试常考的设计模式之建造者模式(Builder)---创建型模式】

JAVA的22种设计模式 java设计模式集大成--易理解!慢慢积累追加笔记。 阅读详情

【Java中23种面试常考的设计模式之建造者模式(Builder)—创建型模式】

知识回顾:

之前我们讲过的设计模式在这里呦:
【面试最常见的设计模式之单例模式】
【面试最常见的设计模式之工厂模式】
【Java中23种面试常考的设计模式之备忘录模式(Memento)—行为型模式】
【Java中23种面试常考的设计模式之观察者模式(Observer)—行为型模式】
【Java中23种面试常考的设计模式之模板模式(Template)—行为型模式】
【Java中23种面试常考的设计模式之状态模式(State)—行为型模式】
【Java中23种面试常考的设计模式之策略模式(Strategy)—行为型模式】
【Java中23种面试常考的设计模式之迭代器模式(Iterator)—行为型模式】
【Java中23种面试常考的设计模式之访问者模式(Visitor)—行为型模式】
【Java中23种面试常考的设计模式之中介者模式(Mediator)—行为型模式】
【Java中23种面试常考的设计模式之解释器模式(Interpreter)—行为型模式】
【Java中23种面试常考的设计模式之命令模式(Command)—行为型模式】
【Java中23种面试常考的设计模式之责任链模式(Chain of Responsibility)—行为型模式】
【Java中23种面试常考的设计模式之适配器模式(Adapter)—结构型模式】
【Java中23种面试常考的设计模式之桥接模式(Bridge)—结构型模式】
【Java中23种面试常考的设计模式之组合模式(Composite)—结构型模式】
【Java中23种面试常考的设计模式之装饰器模式(Decorator)—结构型模式】
【Java中23种面试常考的设计模式之外观模式(Facade)—结构型模式】
【Java中23种面试常考的设计模式之享元模式(Flyweight)—结构型模式】
【Java中23种面试常考的设计模式之代理模式(Proxy)—结构型模式】
【Java中23种面试常考的设计模式之单例模式(Singleton)—创建型模式】
【Java中23种面试常考的设计模式之原型模式(prototype)—创建型模式】
接下来我们要进行学习的是:【Java中23种面试常考的设计模式之建造者模式(Builder)—创建型模式】。

建造者模式

  1. 使用多个简单的对象一步一步构建成一个复杂的对象。
  2. 实际开发中,我们所需要的对象构建时非常复杂,且有很多步骤需要处理时,这时建造者模式就很适合。
  3. 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
  4. 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用

解决的问题

  1. 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

生产开发中常用的使用场景

  1. StringBuilder类的append方法
  2. SQL中的PreparedStatement

模式优点与缺点

优点
  1. 建造者独立,易扩展。
缺点
  1. 内部变化复杂,会有很多的建造类。

核心角色

指挥者Director:定义产品组装接口及组装的实现
抽象建造者Builder:定义我们的组件构造者
产品Product:最终的产品类
具体建造者ConcreteBuilder:定义我们的实现组件构造者
测试客户端类

UML类图

在这里插入图片描述

实现代码

最终产品类(以及三个组件内部类)
package com.builder;

/*
 * 最终的产品类
 */
public class Product {

    private PartA partA;

    private PartB partB;

    private PartC partC;

    public Product() {

    }

    public Product(PartA partA, PartB partB, PartC partC) {
        this.partA = partA;
        this.partB = partB;
        this.partC = partC;
    }

    public PartA getPartA() {
        return partA;
    }

    public void setPartA(PartA partA) {
        this.partA = partA;
    }

    public PartB getPartB() {
        return partB;
    }

    public void setPartB(PartB partB) {
        this.partB = partB;
    }

    public PartC getPartC() {
        return partC;
    }

    public void setPartC(PartC partC) {
        this.partC = partC;
    }

    public void show() {
        System.out.println("成功建造对象以及内部组件:");
        System.out.println(partA.toString() + "---" + partA.getName());
        System.out.println(partB.toString() + "---" + partB.getName());
        System.out.println(partC.toString() + "---" + partC.getName());
    }
}

// Product产品类中的A对象
class PartA {

    private String name;

    public PartA() {

    }

    public PartA(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "PartA [name=" + name + "]";
    }

}

// Product产品类中的B对象
class PartB {

    private String name;

    public PartB() {

    }

    public PartB(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "PartB [name=" + name + "]";
    }

}

// Product产品类中的C对象
class PartC {

    private String name;

    public PartC() {

    }

    public PartC(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "PartC [name=" + name + "]";
    }

}

指挥者
package com.builder;

public class Director {

    private Builder builder;

    public Director() {
    };

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

    public Product construct() {
        return builder.getResult();
    }
}

建造者
package com.builder;

public abstract class Builder {

    protected Product product;

    public Builder() {
    };

    public Builder(Product product) {
        this.product = product;
    }

    public abstract void buildPartA();

    public abstract void buildPartB();

    public abstract void buildPartC();

    public abstract Product getResult();

}
具体建造者
package com.builder;

public class ConcreteBuilder extends Builder {

    public ConcreteBuilder(Product product) {

        this.product = product;

    }

    @Override
    public void buildPartA() {

        // Auto-generated method stub
        product.setPartA(new PartA("产品中的A部件"));
    }

    @Override
    public void buildPartB() {

        // Auto-generated method stub
        product.setPartB(new PartB("产品中的B部件"));
    }

    @Override
    public void buildPartC() {

        // Auto-generated method stub
        product.setPartC(new PartC("产品中的C部件"));
    }

    @Override
    public Product getResult() {
        buildPartA();
        buildPartB();
        buildPartC();
        // Auto-generated method stub
        return product;
    }

}

Main函数测试类
package com.builder;

public class Main {

    public static void main(String[] args) {
        System.out.println(".........产品开始建造........");
        Product product = new Product();

        Builder builder = new ConcreteBuilder(product);

        Director director = new Director(builder);

        Product resProduct = director.construct();
        System.out.println(".........产品建造结束........");
        resProduct.show();
    }

}

运行结果:

在这里插入图片描述

好了,到这里【Java中23种面试常考的设计模式之建造者模式(Builder)—创建型模式】,23种设计模式持续更新汇总中。

Python pydub实现语音停顿切分 将pcm文件批量处理成wav文件 import wave import os filepath = "data/" # 添加路径 filename = os.listdir(filepath) # 得到文件夹下的所有文件名称 #f = wave.open(filepath + filename[1], 'rb') #print(filename) for i in range(len(fi... 阅读详情

相关推荐

ADF4002分频器避坑指南:常见配置错误及解决方案

本文深入解析了ADF4002分频器在实战应用中的常见陷阱与解决方案。内容涵盖寄存器配置逻辑、硬件PCB布局要点、软件驱动时序细节及系统化调试方法,重点阐述了如何避免因配置错误导致芯片无法正常工作的问题,帮助工程师高效完成高精度频率合成系统设计。

weixin_29192141的博客 96

23种设计模式-3建造者模式

本文介绍了建造者模式(Builder Pattern)的概念和应用。建造者模式是一种创建型设计模式,用于分步骤构建复杂对象,特别适用于参数多、构造过程复杂的场景。文章对比了建造者模式与工厂模式的区别,详细说明了建造者模式的四个角色(产品、抽象建造者、具体建造者和指导者),并通过构建Computer对象的代码案例展示了具体实现。最后探讨了StringBuilder是否应用建造者模式的问题,指出它体现了建造者思想但并非经典实现。该模式能提高API清晰度,支持链式调用,提升代码可维护性。

不开心就吃辣 947

Codex驱动AEDT完成无线充电仿真——从双线圈建模到三维电磁场动画

本文介绍了一个利用Codex、PyAEDT和Ansys Electronics Desktop 2025 R2实现双线圈无线充电系统自动建模与仿真的案例。通过简化模型(平面线圈+铁氧体磁芯),完成了从参数化建模、电磁场求解到后处理的全流程自动化,获得了耦合系数(k=0.17)、三维电磁场分布及多周期动态可视化效果。研究发现:线圈间距对传输效率影响最大(10-30mm间距时效率从40.2%降至5.57%),横向偏移15mm会使效率下降35%,而磁芯厚度增加带来的效率提升有限(3→7mm仅提高1.67%)。该框

sjjsjjsjjsjjsjj的博客 446

Java 23 种设计模式:从踩坑到精通 —— 开篇及系列介绍

摘要:本文是《Java 23种设计模式:从踩坑到精通》系列的总入口与导航页。文章梳理了设计模式的起源与三大分类,结合SOLID六大原则,详解为什么2026年设计模式依然重要。提供25篇完整目录、面试高频Top10速记、场景速查索引、易混模式对比表及分级阅读路线,可作为长期收藏的设计模式学习手册。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 3581

Ubuntu24.04/20.04设置网络共享文件夹

Ubuntu20.04利用向日葵远程控制时,不能传输文件。使用linux版本QQ来传输是可以的,不过linuxqq功能真的很弱。因此,打算在Ubuntu系统中建立一个共享文件夹,可在局域网中访问。 1、新建共享文件夹 获取root权限,或者登陆root账户。可在/home文件夹(或其它文件夹)下新建一个文件夹,如share。 右击文件夹,选择“本地网络共享”菜单。按下图设置。 点击确定。如果系统已经安装了samba服务器,就可以进入第3步。如果没有,会提示安装,按提示安装,可能会出错,可进.

willhu2008的专栏 2万+

在LinuxMint 22.1(Ubuntu24.04)上安装使用同花顺远航版

Linux用户成功在LinuxMint22.1系统上通过Wine9.0运行同花顺远航版,解决了长期困扰的股票行情软件问题。此前Linux原生版同花顺功能简陋且停止更新,Wine版通达信存在显示问题。作者作为自由软件支持者,通过调整Wine配置文件解决了高分屏显示异常问题,实现了远航版的正常使用。期待同花顺能重启Linux原生版开发,支持更多处理器架构,完善国产软件生态。该方案为Linux股票软件用户提供了实用参考。

5135

拿到offer了,面试总结之——23种Java设计模式

【背景说明】 情人节那天网投了16家公司,第二天下午一家邀约面试,今天面试完就拿到offer了,准备些入职资料以及体检报告,下周上班。 托情人节的福,拿到offer的同时,接到另一家的面试邀约。还是准备准备明天去看看情况,呵呵。。。   【面试总结】 虽然拿到offer,但感觉面试过程中,技术方面的问答自己并不满意,其实问题不难,稍微准备一下就可以了,或许开发中用得少了,结果一时短路,回...

梦开始的地方 720

AD从原理图到PCB超详细教程

我在学习AD的时候,看了网上很多教程,但是东西很杂,有很多条理不清而且废话很多,所以相信大家学习的时候也是遇到一样的困难。我就特地写一篇帖子,整理了一下AD从画原理图开始一直到画完PCB文件的所有步骤,一方面是供大家参考学习,另一方面可以方便我自己学习记忆更加深刻。我用的版本是AD16中文版,大家用新的版本AD20或者AD22应该操作都是差不多的。

人生寂寞如雪 18万+

Java 23 种设计模式:从踩坑到精通 | 建造者模式 —— 构造器参数太多?试试链式调用

构造器参数太多怎么办?重叠构造器可读性差,setter 破坏不可变性。本文用链式调用的建造者模式优雅解决,附 StringBuilder、Lombok @Builder 实战案例,彻底告别“构造器地狱”。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 1202

【RH850/U2A】:功能安全

功能安全相关

3130

yolov26改进 | 融合改进篇 | 基于 MobileNetV4 和双向特征金字塔网络BiFPN的融合改进(全网独家首发)

本文介绍BiFPN与MobileNetV4融合改进的YOLOv26。许多模块单独使用能够涨点,但直接叠加后可能因功能重复、通道不匹配、尺度冲突而掉点,因此融合前必须理解各模块作用。MobileNetV4利用UIB与Mobile MQA构建轻量主干,提升特征提取能力;BiFPN通过可学习权重完成双向多尺度融合,强化大、中、小目标的信息交互。两者优化Backbone与Neck,功能互补、结构冲突较少。本文提供代码、配置、消融对比及Codex修改思路,MobileNetV4也可替换其他主干,便于组合实验与二次创新

Snu77的博客 241

《JAVA面经实录》- 23种设计模式面试题(二)

《JAVA设计模式面试精要》摘要:本文系统解析23种设计模式,分为创建型(单例、工厂等)、结构型(适配器、代理等)和行为型(观察者、策略等)三大类。重点阐述六大设计原则(SOLID+迪米特法则),每个模式均包含定义、原则应用、优缺点分析及典型业务场景(如电商支付、审批系统等),并附Java代码实现。特别强调模式选择需结合实际需求,避免过度设计,同时提供清晰的模式对比表格,帮助开发者快速掌握各模式核心特征与应用场景。

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 894

追MM与设计模式(23种设计模式巧妙解析,趣味理解)

关注“java后端技术全栈”回复“000”获取优质面试资料瞎扯一会 大家好,我是老田,今天给大家分享如何通俗易懂的理解设计模式。设计模式作为我们程序员必备的基本功,由此,很多人也很纳闷,到...

田维常 503

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

23个设计模式一文搞懂

本笔记涵盖 23 种经典设计模式,按创建型、结构型、行为型三大类整理。每个模式配有生活类比、核心思想、结构图解、实现要点、真实应用案例、适用场景、优缺点分析及常见面试题。

weixin_72753562的博客 802

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

23种设计模式_创建型模式

设计模式提供的是面对各种复杂场景中常规的解决方案,具体到实际业务中,其逻辑实现是千差万别的。创建型模式的核心是如何创建对象,让对象的创建逻辑与业务逻辑解耦,提升系统的灵活性与可维护性。

qq_34697002的博客 362

设计模式(一) - 建造者模式、单例模式、工厂模式

本文系统介绍了三种常见设计模式:单例、工厂和建造者模式。单例模式保证全局唯一实例,分为饿汉式(类加载创建)和懒汉式(延迟加载+DCL双重检查锁),枚举单例是线程安全的最佳实践。工厂模式封装对象创建,包含简单工厂(if-else判断)、工厂方法(每个产品对应工厂)和抽象工厂(生产产品族)。建造者模式适用于复杂对象的分步构建,通过链式调用提高可读性,常用于多字段实体类创建。三种模式核心区别:单例控制实例数量,工厂直接提供完整对象,建造者关注组装过程。文章详细分析了各种实现方式的优缺点、适用场景及线程安全问题,并

weixin_45839019的博客 283

Java编程23种设计模式实战篇21:Java设计模式

三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。第一个是算法关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本。

2401_84584338的博客 423

你敢信?清华毕业前辈用了一个坦克大战项目就讲完了23种设计模式

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。Mybatis面试专题MySQL面试专题并发编程面试专题《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!MySQL面试专题。

2401_84048034的博客 811

《JAVA面经实录》- SpringBoot 电商项目23种设计模式(三)

最终版·生产级 SpringBoot 电商项目: 已补全所有漏洞 + 23 种设计模式真实串联 + Spring 生态融合 + 可简历可面试可上线

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 556

Java面试通关⑰:设计模式全集

摘要:设计模式是代码架构思维、框架源码设计、高质量代码必备能力,大厂面试高频问模式原理、落地场景、源码应用。多数开发者只会CRUD,代码冗余、耦合严重、扩展性差,不懂设计模式思想,无法写出高复用、高扩展、低耦合代码,面试架构思维题失分严重。本篇全覆盖23种设计模式核心、常用模式原理、场景、源码案例、手写实现,掌握架构设计思维,写出高质量工程代码。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 485

Java设计模式面试全攻略:理论与实战解析

设计模式是软件开发中解决常见问题的经典方案,通过封装最佳实践提升代码的可维护性和扩展性。其核心原理基于面向对象设计原则,如SOLID原则,通过合理的对象组合与职责分配实现灵活架构。在Java生态中,设计模式广泛应用于框架开发(如Spring的Bean管理采用工厂模式)和业务系统实现(如支付系统的策略模式)。典型应用场景包括对象创建(单例模式处理全局缓存)、接口适配(第三方登录集成)以及行为封装(订单状态观察者)。掌握设计模式不仅能优化代码结构,更是应对技术面试的关键,特别是在高并发(线程安全单例)和复杂系统

weixin_30443075的博客 396

Java8设计模式最佳实战-设计模式概述(第一天学习记录)

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!重点词汇over and over 转来转去 ; 〔美〕反反复复as well as 既…又… ; 除…之外 ; 此外In addition 另外;加之;除…之外regardless of 不管 ; 不顾 ; 不理会programming language 编程语言by the name of 名叫…;以…为名重点词汇As well as 既…又… ; 除…之外 ; 此外types of 类型 ; 的型态 ;

2401_84092398的博客 694

我用泡妹子追 MM 的技术学会了 23 种设计模式!

编辑:业余草来源:https://www.xttblog.com/?p=4918阿里系饿了么正在大量招人,我内推 Java 方向!薪资不设上限,工作年龄...

xmt1139057136的专栏 622

最全Java面试之 OOAD & UML(3),三面美团Java岗

答:1)两种形式:dtd 以及schema;2)本质区别:schema 本身是xml 的,可以被XML 解析器解析(这也是从DTD上发展schema 的根本目的);3)解析方式:有DOM,SAX,STAX 等:DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM 的树结构所造成的,这种结构占用的内存较多,而且DOM 必须在解析文件之前把整个文档装入内存,适合对XML 的随机访问;SAX:不同于DOM,SAX 是事件驱动型的XML 解析方式。它顺序读取XML 文件,不需要一次全部装载整个文件。

2401_84002482的博客 804

ChatTTS-ui 音色定制保姆级教程:3步选音色、导入音色文件、加上情绪效果

你有一批播客稿子,默认的朗读声有点"机器味",想换一种声音来念。ChatTTS-ui 是一个本地网页工具,能把中英文混合文本合成为语音,而音色定制这件事,它只需要几个数字和一个文件夹就能搞定。 ## 选个数字:3步拿到第一个能用的音色 1. 启动服务,打开网页(它同样对外开放 API 接口)。 2. 在音色下拉框里挑一个数字:2222、7869、6653、4099、5099,这些都是内置音色,

gitblog_00239的博客 411

Mybatis 中经典的 9 种设计模式!面试可以吹牛了!

往期热门文章:1、《往期精选优秀博文都在这里了!》2、海量交易订单查询没做“重试”,一哥们“喜提”P3故障!3、2020年Java框架排行榜,谁居榜首?4、39 个奇葩代码注释,看完笑哭...

Java后端技术 856
上一篇: 【LeetCode每日一题:1678.Goal解析器~~~模拟/正则表达式】
下一篇: 【详细学习SpringBoot自动装配原理分析之核心流程初解析-1】
硕风和炜
硕风和炜 优质创作者: Java技术领域 优质创作者: Java技术领域
博客等级 码龄7年 2万+粉丝 1024原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值