技术成神之路:设计模式(二)建造者模式

麒麟V10 SP3国产化环境部署MySQL 8.0全流程实战 本文详细介绍了在国产化操作系统麒麟V10 SP3上部署MySQL 8.0的全流程实战指南。从环境准备、冲突排查到安装包处理、服务配置与安全加固,提供了详细的命令和技巧,帮助用户顺利完成MySQL 8.0的部署与优化,适用于国产化环境下的数据库应用。 阅读详情

相关文章:技术成神之路:二十三种设计模式(导航页)

1.定义


建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象,而不必直接调用构造函数。建造者模式特别适合那些包含多个组成部分并且构造过程复杂的对象。

2. 结构


建造者模式的主要组成部分包括:

  • 产品(Product): 要创建的复杂对象。
  • 建造者(Builder): 用于创建产品各个部分的抽象接口。
  • 具体建造者(Concrete Builder): 实现Builder接口,构造和装配产品的各个部分。
  • 指挥者(Director): 负责管理建造过程,指导建造者如何构建产品。

3. 类图


在这里插入图片描述

4. 实现步骤


  • 定义产品类: 这类是要创建的复杂对象,包含多个部分。
  • 定义抽象建造者接口: 定义构建产品各部分的方法。
  • 实现具体建造者类: 实现接口,完成各部分的构建。
  • 定义指挥者类: 管理建造过程,使用建造者接口来创建产品。

5. 代码示例


// 产品类
class Computer {
    private String cpu;
    private String gpu;
    private int ram;
    private int storage;

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public void setGpu(String gpu) {
        this.gpu = gpu;
    }

    public void setRam(int ram) {
        this.ram = ram;
    }

    public void setStorage(int storage) {
        this.storage = storage;
    }
}

// 抽象建造者
interface ComputerBuilder {
    void buildCPU();
    void buildGPU();
    void buildRAM();
    void buildStorage();
    Computer getResult();
}

// 具体建造者
class GamingComputerBuilder implements ComputerBuilder {
    private Computer computer;

    public GamingComputerBuilder() {
        computer = new Computer();
    }

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

    @Override
    public void buildGPU() {
        computer.setGpu("NVIDIA RTX 3080");
    }

    @Override
    public void buildRAM() {
        computer.setRam(32);
    }

    @Override
    public void buildStorage() {
        computer.setStorage(2000);
    }

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

// 指挥者
class Director {
    private ComputerBuilder builder;

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

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

// 客户端代码示例
public class Client {
    public static void main(String[] args) {
        // 创建具体建造者
        ComputerBuilder builder = new GamingComputerBuilder();

        // 创建指挥者并传入建造者
        Director director = new Director(builder);

        // 构建复杂对象
        Computer computer = director.construct();
    }
}

在上述示例中:

  • Computer 是要构建的复杂对象,包含了几个部件(CPU、GPU、RAM、存储)。
  • ComputerBuilder 是抽象建造者接口,定义了构建每个部件的方法。
  • GamingComputerBuilder 是具体建造者,实现了具体部件的构建方法。
  • Director 是指挥者,负责按照一定顺序调用具体建造者的方法来构建对象。
  • Client 是客户端代码,通过指挥者来构建复杂对象。

6. 建造者模式的变体


内部类建造者

在实际开发中,使用内部类建造者最为常见,大多数第三方库和安卓系统源码也都使用了建造者模式,主要是方便好用。

public class Car {
    private final String engine;
    private final String body;
    private final String wheels;
    private final String interior;

    private Car(Builder builder) {
        this.engine = builder.engine;
        this.body = builder.body;
        this.wheels = builder.wheels;
        this.interior = builder.interior;
    }

    public static class Builder {
        private String engine;
        private String body;
        private String wheels;
        private String interior;

        public Builder setEngine(String engine) {
            this.engine = engine;
            return this;
        }

        public Builder setBody(String body) {
            this.body = body;
            return this;
        }

        public Builder setWheels(String wheels) {
            this.wheels = wheels;
            return this;
        }

        public Builder setInterior(String interior) {
            this.interior = interior;
            return this;
        }

        public Car build() {
            return new Car(this);
        }
    }

    @Override
    public String toString() {
        return "Car [Engine=" + engine + ", Body=" + body + ", Wheels=" + wheels + ", Interior=" + interior + "]";
    }

    public static void main(String[] args) {
        Car car = new Car.Builder()
            .setEngine("V8 Engine")
            .setBody("SUV Body")
            .setWheels("Alloy Wheels")
            .setInterior("Leather Interior")
            .build();
        
        System.out.println(car);
    }
}

7. 建造者模式经典应用 AlertDialog.Builder 源码分析


在 Android 源码中,AlertDialog.Builder 类用于创建 AlertDialog 对象。它提供了一种链式调用的方式来设置对话框的各种属性,如标题、消息、按钮等。

核心成员变量

private final AlertController.AlertParams P;

P 是 AlertController.AlertParams 的一个实例,用于存储和管理对话框的各种参数。

构造函数

public Builder(Context context) {
    P = new AlertController.AlertParams(new ContextThemeWrapper(context,
            resolveDialogTheme(context, 0 /* default theme */)));
}

在构造函数中,会创建一个 AlertController.AlertParams 对象,这个对象包含了对话框的参数设置。

设置标题和消息

public Builder setTitle(CharSequence title) {
    P.mTitle = title;
    return this;
}

public Builder setMessage(CharSequence message) {
    P.mMessage = message;
    return this;
}

设置按钮

public Builder setPositiveButton(CharSequence text, final OnClickListener listener) {
    P.mPositiveButtonText = text;
    P.mPositiveButtonListener = listener;
    return this;
}

public Builder setNegativeButton(CharSequence text, final OnClickListener listener) {
    P.mNegativeButtonText = text;
    P.mNegativeButtonListener = listener;
    return this;
}

这里的方法它们返回 Builder 对象自身,以支持链式调用。我们在自定义FragmentDialog的时候会经常用到。

创建对话框

 public AlertDialog create() {
            // Context has already been wrapped with the appropriate theme.
            final AlertDialog dialog = new AlertDialog(P.mContext, 0, false);
            P.apply(dialog.mAlert);
            dialog.setCancelable(P.mCancelable);
            if (P.mCancelable) {
                dialog.setCanceledOnTouchOutside(true);
            }
            dialog.setOnCancelListener(P.mOnCancelListener);
            dialog.setOnDismissListener(P.mOnDismissListener);
            if (P.mOnKeyListener != null) {
                dialog.setOnKeyListener(P.mOnKeyListener);
            }
            return dialog;
        }

create() 方法用于实际创建 AlertDialog 对象。在这里,会通过 AlertController.apply() 方法将 AlertParams 中的参数应用到 AlertDialog 中,并设置对话框的可取消性、监听器等。

使用示例

不是吧啊sir ,AlertDialog谁没用过啊,谁还看你的示例 。

好! 不写了 😊

8. 适用场景及优势


场景:

  • 构建和表示分离: 产品的构建过程和最终表示需要解耦。
  • 需要构建复杂对象: 产品包含多个部分,构建过程比较复杂。
  • 需要多个产品表示: 同样的构建过程可以创建不同的产品表示。

优势:

  • 灵活的对象构建: 可以根据需要调整构建过程,创建不同的产品表示。
  • 高度可读的代码: 通过分步骤构建对象,使代码更易于理解和维护。
  • 良好的扩展性: 可以轻松添加新的构建步骤或修改现有步骤,而不会影响客户端代码。

9. 结论


建造者模式是一种强大的设计模式,特别适合构建过程复杂的对象。它通过将对象的构建过程与表示分离,使得代码更具可读性和可维护性。同时,建造者模式还可以灵活地创建不同的产品表示。

建造者模式不难理解,记住好的代码都是重构出来的,设计模式也是,多写,多练才能真正掌握它的核心。

华为OD机试真题 新系统2026-04-08 C++ 实现【直捣黄龙】 小王在玩一款叫做直捣黄龙的小游戏,在该游戏中他需要从入口位置进入敌营,绕过哨兵的层层封锁,达到敌军司令部实施斩首行动。 敌军阵营是一个n*n的矩阵,入口在坐标(0,n/2),敌军司令部在坐标(n-1,n/2),每个 哨兵警戒以自己为中心的9宫格,一旦被哨兵发现则行动失败。 阅读详情

相关推荐

AHP层次分析法在项目风险评估中的实战应用(含Excel模板)

本文详细介绍了AHP层次分析法在项目风险评估中的实战应用。通过构建风险层次模型、利用判断矩阵量化主观判断,并结合Excel工具进行权重计算与一致性检验,将模糊的定性风险转化为清晰的量化排序。文章以新产品上线项目为例,提供了完整的分析流程和可操作的Excel模板,帮助项目经理高效识别并优先处理核心风险。

weixin_29061465的博客 570

Java成神路上之设计模式系列教程之一

Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在你的代码里面使用过任何设计模式? 解释下什么是观察者模式? 使用工厂模式最主要的好处是什么?在哪里使用? 等等相关的问题,那么问题来了,究竟什么是设计模式,它与我们又有什么关系?在我们的...

qfchenjunbo的博客 130

WPF的基础设施:XAML基础语法

XAML是WPF的核心标记语言,采用XML语法实现界面与逻辑分离。其基础语法包括:1)控件声明方式(特性语法和属性元素语法);2)x:Name与Name的区别(适用范围和编译行为);3)注释规范与代码折叠技巧;4)实用特性如属性继承、附加属性等。文章还提供了常见错误排查方法,建议通过实践练习掌握XAML开发技巧。全文系统介绍了XAML的核心语法与应用场景,是WPF开发者的基础学习指南。

Hare的博客 1755

技术成神之路:二十三种设计模式(导航页)

设计原则/模式 链接 面向对象的六大设计原则 技术成神之路:面向对象的六大设计原则 创建型模式 单例模式 建造者模式 原型模式 工厂方法模式 抽象工厂模式 行为型模式 策略模式 状态模式 责任链模式 观察者模式 备忘录模式 迭代器模式 模板方法模式 访问者模式 结构型模式 享元模式 中介者模式 代理模式 组合模式 适配器模式 桥接模式 装饰模式 外观

WriteBug001的博客 587

绝缘检测原理和绝缘电阻计算方法

绝缘检测的目的就是计算绝缘电阻,当绝缘电阻低于某个阈值,则很可能会造成电池短路、漏电,威胁人员安全

m0_56208280的博客 4万+

大模型备案避坑指南:如何设计符合TC260标准的评估测试题集?

本文深入探讨了如何设计符合TC260标准的大模型评估测试题集,以顺利通过备案。文章从解构标准核心逻辑出发,详细阐述了题集设计的工程化流程、核心原则与常见误区,并提供了模拟真实对抗的高阶测试策略与度量分析方法,旨在帮助企业构建一套能真实反映模型安全水位、有效规避风险的评估体系。

kafka6courier的博客 662

CMap分子指纹搜索引擎:从基因表达向量到药物重定位

CMap(Connectivity Map)是一种基于基因表达谱的高维生物信息检索系统,其核心是将化合物转化为978个标志性基因的z-score向量,通过线性代数运算(如加权余弦相似度)实现跨扰动条件的生物学关联匹配。它不依赖SQL或传统数据库架构,而是以HDF5张量格式存储、以L1000平台标准化数据为基石,支撑药物重定位、通路机制解析与多组学验证等关键科研任务。作为药理学与计算生物学交叉的典型范式,CMap已成为小分子功能注释、老药新用发现及单细胞数据解读的重要基础设施,广泛应用于抗纤维化、抗肿瘤及炎症

weixin_34411563的博客 405

大规模新闻聚合爬虫实战:Python爬取数百万新闻数据的完整指南

本文详细介绍了如何构建一个大规模新闻聚合爬虫,结合Python异步爬虫技术,实现高效、稳定的新闻数据采集。增加NLP模块对新闻内容做自动分类、情感分析。引入机器学习模型检测新闻真实性。使用分布式爬虫框架进一步提升规模。增加多媒体内容抓取与处理。

2201_76125261的博客 1554

gpio的8种工作模式_Java成神路上之设计模式系列教程之一

Java成神路上之设计模式系列教程之一千锋-Feri在Java工程师的日常中,是否遇到过如下问题:Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式?什么是设计模式?你是否在你的代码里面使用过任何设计模式?解释下什么是观察者模式?使用工厂模式最主要的好处是什么?在哪里使用?等等相关的问题,那么问题来了,究竟什么是设计模式,它与我们又有什么关系?在我们的日常开发中充当什么样的作用?...

weixin_39739404的博客 102

Flink上传的Jar包去了哪里?大数据

在使用Flink时,我们通常会将应用程序打包成Jar文件并将其上传到Flink集群以执行。总结起来,Flink上传的Jar包实际上会暂时存储在JobManager的本地文件系统中的一个临时目录中。在上传过程中,Flink会将Jar文件存储在JobManager的本地文件系统中的一个临时目录中。一般来说,Flink会在。希望本文对你解答了Flink上传的Jar包去了哪里的疑问,并且能够帮助你更好地理解Flink的工作原理。接下来,我们可以使用Flink命令行工具将Jar文件提交到Flink集群。

AlianBlank的博客 865

KCP(快速可靠UDP)——用带宽换延迟的极致艺术

想象你是一个外卖平台的调度员。这就是KCP的本质——

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 202

夜光带你走进 Java 成神之路(十三)擅长的领域

夜光序言: 台上的人演绎的是台下人的寂寞悲喜,而台下的人看到的是台上人的云散萍聚。 正文: 以道御术 / 以术识道 package 建造者模式.builder; public class CommonHouse exten...

夜光的博客 179

用 SAP XCO XLSX 模块优雅读 Excel:坐标、选择模式与实战案例全解析

SAP ABAP Cloud 中的 XCO XLSX 模块为 Excel 文件处理提供了官方解决方案。文章介绍了三个核心概念:通过 XCO_CP_XLSX=>DOCUMENT 获取文档句柄;使用 CL_XCO_XLSX_COORDINATE 坐标系统定位单元格;利用 Selection Pattern 精确读取数据区域。这些功能在 RAP 批量导入等业务场景中尤为实用,相比传统方案更加简洁可靠。文章还分享了真实项目中的最佳实践,如动态列定位和相对偏移技巧,帮助开发者构建更健壮的 Excel 导入逻辑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 193

耗时两月!20+真实案例场景、近300页、18W字,这份【Java设计模式实践指南】已然成神,堪称经典

什么是设计模式?这个问题我问过的面试者不下于数十次,回答五花八门。 在我看来,模式就是经验,设计模式就是设计经验,有了这些经验,我们就能在特定情况下使用特定的设计、组合设计,这样可以大大节省我们的设计时间,提高工作效率。 作为一个工作已久的老码农,经历的系统架构设计也算不少,接下来,我会把工作中用到的一些架构方面的设计模式总结成了一个文档分享给大家,望大家少走弯路。 创建者模式(五种) 工厂方法模式 工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象

资料免费分享,点击名片 392

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

假人有限元模型

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

教你快速学会设计模式

附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全: 书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈 ①【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版) ②【算法数据结构+acm】从入门到进阶吐血整理书单50+本(珍藏版) ③【数据库】从入门到进阶必读18本技术书籍网盘吐血整理网盘(珍藏版) ④【Web前端】从HT...

黑技的博客 427

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

如何从分类层面,深入理解设计模式?

推荐阅读: 这套Github上40K+star学习笔记,可以帮你搞定95%以上的Java面试 毫不夸张的说,这份SpringBoot学习指南能解决你遇到的98%的问题 给跪了!这套万人期待的 SQL 成神之路PDF,终于开源了 学习过设计模式的都知道,设计模式分为三大类,分别是:创建型、结构型、行为型。但为什么它们这么分呢?某个设计模式为啥就属于结构型,而不属于行为型呢?创建型、结构型、行为型...

xingduan5153的博客 150

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

真是恍然大悟啊!Redis成神之路电子版教程已问世

前言 我在知乎上看到这样一个话题,关于程序员的: 听同学说干码农这行每天都要加班,这样的话,不就没精力做别的事情了。有个师兄做 IT 销售,不太辛苦,生活还算是美滋滋,是真的吗?我也知道社会上干哪一行都不容易,可是好像码农生活确实单调无聊。天天敲代码,日常嗨一嗨都没时间,更别说有精力谈恋爱了。想问问正在工作的各位前辈,你们的生活是怎么样的? 开门见山、开诚布公地说吧,我是一个对技术没有很大热情的程序员。这样说会不会遭到一些同学们的 DISS?不管了,反正我知道一不小心又甩了两个成语,感觉自己挺有才华的。

m0_56530263的博客 121

【JavaEE】单例模式和阻塞队列

阻塞队列是Java并发编程中一个非常重要的概念,它提供了一种线程安全且高效的机制来管理多线程环境下的任务调度和资源分配。通过选择合适的阻塞队列类型,可以有效地控制并发级别,提高系统的响应能力和吞吐量。

2302_79806056的博客 1372

如何在面试中通过工厂模式来给自己加分?

推荐阅读: 这套Github上40K+star学习笔记,可以帮你搞定95%以上的Java面试 毫不夸张的说,这份SpringBoot学习指南能解决你遇到的98%的问题 给跪了!这套万人期待的 SQL 成神之路PDF,终于开源了 工厂模式(Factory Method)是用来向使用者屏蔽创建对象的细节。之前我们在讲SAX解析XML文件时,已经用到过工厂模式,当时我们是通过如下代码用SAXPars...

xingduan5153的博客 127

史上超级详细:Java岗面试12家大厂成功跳槽,附项目源码

前言 很多Java程序员一直希望找到一份完整的学习路径,但是市面上很多书都是专注某一个领域的,没有一份完整的大图,以至于很多程序员很迷茫,不知道自己到底应该从哪里开始学,或者不知道自己学习些什么。 好在,很早之前就有一位阿里巴巴的技术专家总结了一份**《Java工程师成神之路》**,作者按照自己的经验总结了从基础,到高级、底层、架构、进阶、扩展等6个大的章节。几乎囊括了Java体系内的所有知识点。 这份资料之前开源在GitHub上,短短几个月时间,收获了15k+的Star数,最近,笔者了解到,该项目有了重大

m0_57286622的博客 165

java后端开发学习路线

java后端开发学习路线 点击此处查看本篇文章视频出处 即使再小的帆也能远航~ 编程基础 java语言 语言基础 基础语法 面向对象 接口 容器 异常 泛型 反射 注解 I/O JVM虚拟机 类加载机制 字节码执行机制 JVM内存模型 GC垃圾回收 JVM性能监控与故障定位 JVM调优 多线程/并发 并发编程的基础 线程池 锁 并发容器 原子类 JUC并发工具类 数据结构和算法 数据结构 字符串 数组 链表 堆,栈,队列 二叉树 哈希 图 算法 排序 查找 贪心 分治 动态规划 回溯.

高小小天的博客 402

怎样设计一个好架构:八个评价维度、四层思考深度,以及 23 种设计模式各自解决什么问题

架构要解决的是变化、理解、故障和协作的成本。本文从耦合、可迁移、可适配、复杂度等八个维度讲怎么评价架构,讲维度之间怎么取舍、架构思考可以分几层,再用可编译的 C 代码过一遍 23 种设计模式。

weixin_52400878的博客 331

设计模式与生活⑰:空腹体检,单子领着人走

一年一度的体检,约在了周二。早上打完卡,没开电脑,先去体检机构——公司指定的那家。空腹,早饭留着查完再吃。前台登记,递身份证,领回一张指引单:姓名、条码,今天要查的项目按房间号排成一列。抽血、心电图、视力……单子一到手,人就被单子领着走了。先查哪项看哪边排队人少,但单子上的项目,一项落不下。去年也是这套流程。单子上的项目换了几样,走的科室还是那几个。身体还是这副身体,单子年年换。这事儿跟代码里的一种结构,是一回事。单子一到手,人就被单子领着走了今天聊的:元素稳定,操作多变;

工一木子 291

设计模式 - 访问者模式

概述 访问者模式(Visitor Pattern)是一种行为型设计模式,它通过为对象结构中的每个元素添加一个访问操作,使得可以在不改变元素类的前提下定义作用于这些元素的新操作。

2601_96797912的博客 184

工作流 vs 自主 Agent:5 种设计模式与 3 种建模方式详解

本文基于 Anthropic《Building Effective Agents》指南,系统梳理了AI应用中的两类核心架构:Workflow(编排式)与Agent(自主智能体)。强调“能画流程图就不上Agent”,提出从简单提示链到复杂自主决策的5种可组合工作流模式,并给出选型口诀与工程实践建议。核心观点:优先用确定性、可审计的Workflow,仅在任务路径未知时启用Agent,避免盲目复杂化。

分享大数据、java相关的技术 158
上一篇: 技术成神之路:设计模式(一)单例模式
下一篇: 技术成神之路:设计模式(三)原型模式
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值