23天读懂23种设计模式:建造者模式(创建型)

Python 爬虫:获取网页数据的 5 种方法 requests:适用于简单的静态网页抓取,易于使用。requestslxml:适合需要高效解析大规模网页内容的情况,支持 XPath 和 CSS 选择器。Selenium:适用于动态网页(JavaScript 渲染)的抓取,模拟浏览器行为获取动态数据。Scrapy:强大的爬虫框架,适合大规模的网页抓取任务,支持异步请求和高级功能。PyQuery:基于 jQuery 语法,适合快速开发,提供简洁的 CSS 选择器语法。 阅读详情

点击上方 蓝字 关注我们

创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建、组合和表示方式。

建造者模式目的:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

winter

建造者模式也是创建型的设计模式之一,本文是设计模式系列(共24节)的第5篇文章。

设计模式都从六大原则出发进行总结:《第一节:设计模式的六大原则》

创建型设计模式共5种:

建造者模式是什么

建造者模式解决问题:开发过程中,我们经常有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

建造者模式的应用

下面我们复习下建造者模式的应用示例。

举例子1:我们使用建造者模式解决一个问题:利用建造器反馈多种驱动开发的模式。(驱动方法都是有顺序拼接的步骤,汇聚一起形成软件开发的设计思想)

当前有哪些驱动方法作为软件开发者的指导思想呢?
领域驱动设计(Domain-Driven Design):
    1.整个过程大概是这样的,开发团队和领域专家一起通过 通用语言(Ubiquitous Language)去理解和消化领域知识,
    2.从领域知识中提取和划分为一个一个的子领域(核心子域,通用子域,支撑子域),
    3.并在子领域上建立模型,
    4.再重复以上步骤,这样周而复始,构建出一套符合当前领域的模型。
测试驱动开发(Test-Driven Development):
    1.先写功能测试,用户角度描述应用的新功能
    2.功能测试失败后,想办法编写代码让它通过(或者说至少让当前失败的测试通过)此时,使用一个或多个单元测试,定义希望代码实现的效果,保证为应用中的每一行代码(至少)编写一个单元测试
    3.单元测试失败后,编写最少量的应用代码,刚好让单元测试通过。有时,要在第二步和第三步之前多次往复,直到我们觉得功能测试有一点进展为止
    4.再次运行功能测试,看是否通过,或者有没有进展。这一步可能促使我们编写一些新的单元测试和代码等
  • 首先是驱动模式的实体类:

/**
 * <p>
 *     驱动模式抽象类
 * </p>
 */
public abstract class AbstractDrivingMethod {
  protected volatile static List<String> puzzles = new ArrayList();
  protected void addPuzzle(String puzzle){
    puzzles.add(puzzle);
  }
  public void listPuzzles(String driveMethodType){
    System.out.println(driveMethodType + ": \n " + StringUtils.join(puzzles,","));
  }
}
public class TDDAbstractDrivingMethod extends AbstractDrivingMethod {


  //添加TDD(测试驱动)的步骤
  public void addTDDDrivingMethodPuzzle(String puzzle) {
    super.addPuzzle(puzzle);
  }
}
public class DDDAbstractDrivingMethod extends AbstractDrivingMethod {


  //添加DDD(领域驱动设计)的步骤
  public void addDDDDrivingMethodPuzzle(String puzzle) {
    super.addPuzzle(puzzle);
  }
}
  • 然后是建造器类 DrivingMethodBuilder:

/**
 * <p>
 *     驱动方法构造器 DrivingMethodBuilder
 * </p>
 */
public class DrivingMethodBuilder {
  //构造DDDDrivingMethod,组件顺序很重要
  public static AbstractDrivingMethod buildDDDDrivingMethod(){
    DDDAbstractDrivingMethod dddDrivingMethod = new DDDAbstractDrivingMethod();
    dddDrivingMethod.addDDDDrivingMethodPuzzle("1.通过 通用语言(Ubiquitous Language)去理解和消化领域知识");
    dddDrivingMethod.addDDDDrivingMethodPuzzle("2.从领域知识中提取和划分为一个一个的子领域(核心子域,通用子域,支撑子域)");
    dddDrivingMethod.addDDDDrivingMethodPuzzle("3.在子领域上建立模型");
    dddDrivingMethod.addDDDDrivingMethodPuzzle("4.再重复以上步骤,这样周而复始,构建出一套符合当前领域的模型");
    return dddDrivingMethod;
  }
  //构造TDDDrivingMethod,组件顺序很重要
  public static AbstractDrivingMethod buildTDDDrivingMethod(){
    TDDAbstractDrivingMethod tddDrivingMethod = new TDDAbstractDrivingMethod();
    tddDrivingMethod.addTDDDrivingMethodPuzzle("1.先写功能测试,用户角度描述应用的新功能");
    tddDrivingMethod.addTDDDrivingMethodPuzzle("2.功能测试失败后,想办法推动开发,开发修改或编写代码让它通过(或者说至少让当前失败的测试通过)");
    tddDrivingMethod.addTDDDrivingMethodPuzzle("3.单元测试失败后,编写最少量的应用代码,刚好让单元测试通过。有时,要在第二步和第三步之前多次往复,直到我们觉得功能测试有一点进展为止");
    tddDrivingMethod.addTDDDrivingMethodPuzzle("4.再次运行功能测试,看是否通过,或者有没有进展");
    return tddDrivingMethod;
  }
}
  • 测试用例:

public class DrivingMethodBuilderDemo {
  public static void main(String[] args) {
    AbstractDrivingMethod dddAbstractDrivingMethod = DrivingMethodBuilder.buildDDDDrivingMethod();
    dddAbstractDrivingMethod.listPuzzles("dddDrivingMethod");


    AbstractDrivingMethod tddAbstractDrivingMethod = DrivingMethodBuilder.buildTDDDrivingMethod();
    tddAbstractDrivingMethod.listPuzzles("tddDrivingMethod");
  }
}

代码解析:

我们通过建造器 DrivingMethodBuilder 对外开放的API(建造器Builder内部封装了各部分组件的拼装逻辑),完成对目标对象的构建。(这里跟之前我们学习过的工厂方法模式的区别是:建造者模式更加关注与零件装配的顺序)

UML图:

建造者模式优缺点

建造者模式一般用于“需要生成的对象具有复杂的内部结构”。

优点是:独立易扩展,便于控制细节风险;

缺点是:建造器内部生产的产品必须有共同点,导致了对象类型有限制;而且随着不断拓展,建造器内部会越来越复杂,甚至有很多的建造类。

建造者模式在JDK源码的应用

举例子2:在JDK源码里,StringBuilder/StringBuffer就是建造者模式的典型实现。

这两个类最主要的区别就是StringBuilder线程不安全,StringBuffer线程安全。 

AbstractStringBuilder 实现了 Appendable 接口方法所有append()方法,俨然AbstractStringBuilder 已经是就建造者,只是是一个抽象类AbstractStringBuilder ,不能实例化。

StringBuffer buffer = new StringBuffer();
buffer.append("chars")
        .append(11L)
        .append(11)
        .append(true)
        .append(1.1d)
        .append(1.1f)
        ;
  • StringBuffer 方法列表:

  • StringBuilder方法列表:

  • StringBuffer的API,最终指向建造器 AbstractStringBuilder:

    @Override
    public StringBuilder append(char[] str){
        super.append(str);
        return this;
    }
  • 底层建造器AbstractStringBuilder的API:

    public AbstractStringBuilder append(char[] str) {
        int len = str.length;
        ensureCapacityInternal(count + len);
        System.arraycopy(str, 0, value, count, len);
        count += len;
        return this;
    }

总结

本节主要讲解了建造者模式的实现方法和优缺点,另外补充了jdk源码中的建造者模式应用案例。到此,我们对创建型设计模式的总结还剩下抽象工厂模式,待后续我们再细细解读。

往期推荐

《源码系列》

《JDK之Object 类》

《JDK之BigDecimal 类》

《JDK之String 类》

《JDK之Lambda表达式》

《经典书籍》

《Java并发编程实战:第1章 多线程安全性与风险》

《Java并发编程实战:第2章 影响线程安全性的原子性和加锁机制》

《Java并发编程实战:第3章 助于线程安全的三剑客:final & volatile & 线程封闭》

《服务端技术栈》

《Docker 核心设计理念》

《Kafka史上最强原理总结》

《HTTP的前世今生》

《算法系列》

《读懂排序算法(一):冒泡&直接插入&选择比较》

《读懂排序算法(二):希尔排序算法》

《读懂排序算法(三):堆排序算法》

《读懂排序算法(四):归并算法》

《读懂排序算法(五):快速排序算法》

《读懂排序算法(六):二分查找算法》

《设计模式》

《设计模式之六大设计原则》

《设计模式之创建型(1):单例模式》

《设计模式之创建型(2):工厂方法模式》

《设计模式之创建型(3):原型模式》

扫描二维码

获取技术干货

后台技术汇

点个“在看”表示朕

已阅

4.Simulink基础建模操作——加减乘除运算 加减乘除运算 阅读详情

相关推荐

ESP32-CAM搭建Arduino及简单使用

配置环境 方法一 文件 → 首选项 http://wechat.doit.am/package_esp8266com_index.json https://dl.espressif.com/dl/package_esp32_index.json 工具 → 开发板 → 开发板管理器 等待安装 方法二 https://github.com/espressif/arduino-esp32 Arduino安装目录下,找到hardware文件夹 建立文件夹espressif,然后在里面再建立一个esp32文件夹

Ying的博客 2万+

【设计模式】建造型模式

这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。

qq_16813191的博客 190

基于SOEM的伺服电机控制实战:从配置到调试

本文详细介绍了基于SOEM的伺服电机控制实战,从硬件配置到软件调试的全过程。通过分享PDO映射、状态机控制、性能优化等核心技巧,帮助开发者快速掌握EtherCAT通信与伺服电机控制的关键技术,提升工控系统开发效率。

weixin_29165465的博客 519

iOS开发设计模式之创造者模式

建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。 建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成,现在我们来分析其基本结构和实现...

liuyinghui523的专栏 404

generate for与always内for:Verilog循环的静态生成与动态执行之辨

本文深入解析Verilog中generate for与always内部for循环的核心差异。generate for使用genvar变量在编译时静态生成硬件结构,适用于模块实例化;always内部for使用整型变量在运行时动态执行,综合为并行逻辑。理解这两种循环的适用场景和综合结果对提升数字电路设计质量至关重要。

yog99的博客 1086

片上眼图(Eye-opening monitor)

当它们值不同的时候error counter +1,通过统计RX到的码元个数、error counter,可以获得offset sampler上下左右不停的调整位置时的一个误码率(BER),通过这个误码率去描绘出眼图。如上图所示,eye-scan RX端 offset sampler独立且并行的和使用CDR sample的采样电路一起跑,offset-sampler可以任意调整水平(time)和垂直(voltage)方向的偏移(如下图所示),在一个UI内产生一个全新的sample点。

沈土豪的书屋 4414

一堆DD驱动开发方法汇总

7种驱动开发方法(TDD、FDD、BDD、ADD、VDD、RDD和HDD)之间的异同点以及如何选择适当的驱动开发方法的一些考虑因素:

XiaoCai 962

OpenGL绘制简单场景,实现旋转缩放平移和灯光效果

本项目实现了用OpenGL绘制一个简单场景,包含正方体、球体和网格,实现了物体的旋转、缩放、平移和灯光效果。附有项目完整代码,有详细注释。适合初学者熟悉opengl使用。

张竞成的博客 1万+

2.5万字详解23种设计模式—创建型模式(简单工厂、工厂方法、抽象工厂、单例-多线程安全详解、建造者、原型)的详细解读、UML类图

2.5万字详解23种设计模式—创建型模式(简单工厂、工厂方法、抽象工厂、单例-多线程安全详解、建造者、原型)的详细解读、UML类图

qc 795

华为嵌入式面试题及参考答案(持续更新)

异步是指在程序执行过程中,某些任务不需要等待立即完成就可以继续执行其他任务的过程。在计算机编程中,异步通常用于处理长时间运行的操作,如文件读写、网络通信等,以避免阻塞主线程。异步处理通常涉及到回调函数、事件循环、协程或未来的概念。使用宏定义来避免命名冲突。#else#endif堆和栈是计算机程序中用于存储数据的两种不同类型的内存区域。

大模型大数据攻城狮的专栏 2483

深入解析 OpenClaw(小龙虾)源码:架构设计与核心实现

OpenClaw用清晰、工程化的代码结构,将复杂的Agent交互流程变成了可管理、可扩展的流水线。无论是想深入了解Agent系统设计,还是希望二次开发定制自己的AI助理,阅读OpenClaw源码都是一次绝佳的学习旅程。希望本文能帮助你快速掌握OpenClaw的核心脉络。如果你对某个模块(如技能开发、安全机制)感兴趣,欢迎继续探讨。本文基于OpenClaw社区版本源码分析,具体实现可能随版本迭代有所调整,请以最新源码为准。

Ven%的博客 449

TDD, ATDD and BDD

几种常见的敏捷开发模式(Agile Software Development)介绍 TDD Test-Driven Development(测试驱动开发),从测试的角度来检验整个项目。大概的流程是先针对每个功能点抽象出接口代码,然后编写单元测试代码,接下来实现接口,运行单元测试代码,循环此过程,直到整个单元测试都通过 ATDD Acceptance Test-Driven Development ...

Martian 839

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

23天读懂23种设计模式:原型模式(创建型)

点击上方 蓝字 关注我们创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建、组合和表示方式。原型模式目的:用原型实例指定创建对象的种类,并且通过拷贝...

Diligence is the mother of success. 283

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

设计模式|创建型模式

目录 前言 读懂UML图 设计模式六大原则 创建型模式原则 创建型模式 分析 1.简单工厂模式 2.工厂方法模式 3.抽象工厂方法模式 4.建造者模式 5.单例模式 创建型模式 总结 前言 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,设计模式不是具体的代码,而是一种合理、易拓展、易维护的代码架构思想。设计模式被运用在各种优秀的框架中。掌握设...

leo187的博客 2422

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

23天读懂23种设计模式:工厂方法模式(创建型)

点击上方 蓝字 关注我们创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建、组合和表示方式。工厂方法模式目的:封装构造对象具体过程,解耦客户端与构造...

Diligence is the mother of success. 275

23天读懂23种设计模式:单例模式(创建型)

点击上方 蓝字 关注我们创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建、组合和表示方式。单例模式目的:保证一个类仅有一个实例,并提供一个访问它的...

Diligence is the mother of success. 196

23天读懂23种设计模式:抽象工厂设计模式(创建型)

点击上方 蓝字 关注我们创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建、组合和表示方式。抽象工厂模式的目的:提供一个创建一系列相关或相互依赖对象的...

Diligence is the mother of success. 238

一文读懂设计模式

设计模式(Design Pattern)是一套被反复使用、多数知晓、分类编目、代码设计经验的总结。使用设计模式可提高代码的简洁、易读和可维护性,让代码易于被他人理解且保证软件的可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。设计模式这个术语是由 Erich Gamma 等人在 20 世纪 90 年代从建筑设计领域引入的,它是对软件设计领域普遍存在的各种问题所提出的解决方案,不涉及完成应用程序的具体的类或对象。

Doublelv 的博客专栏。 1115

全面了解23种设计模式,细说那些被人所知的设计思想。(一周彻底撸完被23种设计模式疯狂折磨)

一,23种设计模式分为三大类别模式 : 1,创建型模式: 它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成。就像我们去商场购买商品时,不需要知道商品是怎么生产出来一样,因为它们由专门的厂商生产。 2,结构型模式: 它的主要特点是 如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原

Crazy_Cw的博客 2403

java设计模式详解——23种设计模式(一文搞定,全网最详细)

本文总结了Java中23种设计模式的分类与核心概念,重点解析了三种设计模式类型及其应用场景: 创建型模式(5种) 关注对象创建机制,包括单例、原型、工厂方法、抽象工厂和建造者模式,用于灵活创建对象并隐藏细节。 结构型模式(7种) 解决类和对象的组合问题,如适配器、代理、装饰器等,通过继承/组合优化代码结构。 行为型模式(11种) 管理对象间的交互逻辑,包含观察者、策略、命令等模式,定义通信与职责分配规则。 文中通过对比表格和UML类图(含6种关系示例)直观展示设计模式特性,并强调软件设计原则(SOLID)的

蓝桉 2731

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

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

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

一文读懂设计模式,看这篇就够了

一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混。自认为本文还是写得不错的????????????,花了不少心思来写这文章和做图,力求让读者真的能看着简单同时有所收获。 设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结,其中最出名的当属 Gang of Four (GoF) 的分类了,他们将设计模式分类为 23 种经典的模式,根据用途我们又可以分为三大类,分别为创建型模式、结构型模式和行为型模式。 有一些重要的设计原则在开篇和大家分享下,这些原则

weixin_43846916的博客 1026

Python的23种设计模式

设计模式是面对各种问题进行提炼和抽象而形成的解决方案。这些设计方案是前人不断试验,考虑了封装性、复用性、效率、可修改、可移植等各种因素的高度总结。它不限于一种特定的语言,它是一种解决问题的思想和方法。

malingyu的专栏 1226

23种设计模式

一个月学完23种设计模式

qq_36949403的博客 1419

1张表格读懂23种设计模式,让你从小兵向大咖迈进

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。(来源于百度百科)

zoekimjun的专栏 350

一文读懂23种设计模式

一文读懂23种设计模式

ahtohlove的博客 831
上一篇: 23天读懂23种设计模式:原型模式(创建型)
下一篇: 简单五步:利用Gitstats给代码仓库做一次体检
后台技术汇
博客等级 码龄11年 670粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

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

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

打赏作者

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

抵扣说明:

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

余额充值