设计模式之建造者(Builder)模式

news2024/9/23 1:25:50

目录

1、什么是建造者Builder模式?

2、建造者Builder模式的利与弊

3、建造者Builder模式的应用场景

4、建造者模式中的指导者(Director)有什么作用?

5、建造者Builder模式与其他模式的关系

小结


1、什么是建造者Builder模式?

Builder模式是一种创建型设计模式,用于将复杂对象的构建过程和表示分离,使得同样的构建过程可以创建不同的表示。建造者模式又称为生成器模式,主要用于对复杂对象的构建及初始化,它可以将多个简单的组件对象按顺序一步步组装起来,最终完成一个复杂的成品对象。与工厂系列模式不同的是,建造者模式的主要目的在于把烦琐的构建过程从不同对象中抽离出来,使其脱离并独立于产品类与工厂类,最终实现用同一套标准的制造工序能够产出不同的产品

在生活中,一个常见的例子是建筑领域的房屋建造。我们可以将房屋的建造过程看作是使用Builder模式来创建房屋对象的过程。

假设我们需要建造一座房子,房子由多个组成部分(例如地基、楼层、墙壁、窗户等)组成,并且每个部分都有多个属性(例如地基的深度、楼层的高度、墙壁的材料等)。

使用Builder模式,我们可以定义一个HouseBuilder类作为建造者,它负责创建和组装房子的各个部分。HouseBuilder类可以有一些方法来设置房子的各个属性,例如setFoundationDepth(int depth)、setFloorHeight(int height)等。

另外,我们还可以定义一个House类作为最终构建的产品。House类包含了房子的所有属性,并提供了访问这些属性的方法。

下面是一个简化的示例代码:

// 房子类
public class House {
    private int foundationDepth;
    private int floorHeight;
    private String wallMaterial;

    // 构造函数和访问方法省略

    // ...
}

// 建造者类
public class HouseBuilder {
    private House house;

    public HouseBuilder() {
        house = new House();
    }

    public void setFoundationDepth(int depth) {
        house.setFoundationDepth(depth);
    }

    public void setFloorHeight(int height) {
        house.setFloorHeight(height);
    }

    public void setWallMaterial(String material) {
        house.setWallMaterial(material);
    }

    public House build() {
        return house;
    }
}

// 使用Builder模式创建房子对象
public class Main {
    public static void main(String[] args) {
        HouseBuilder builder = new HouseBuilder();
        builder.setFoundationDepth(10);
        builder.setFloorHeight(3);
        builder.setWallMaterial("Brick");

        House house = builder.build();

        // 使用房子对象进行后续操作
        // ...
    }
}

在上述示例中,HouseBuilder类负责创建和设置房子的各个属性,最后通过build()方法返回构建好的House对象。这样,我们可以根据需要灵活地设置房子的各个部分,并且可以通过调用build()方法来获取最终的房子对象。

建造者模式的结构图示:

图片来源:设计模式-生成器(Builder) - 知乎

 图片来源:设计模式-生成器(Builder) - 知乎

2、建造者Builder模式的利与弊

Builder模式具有以下优点

  1. 隔离复杂对象的构建过程:Builder模式将复杂对象的构建过程与其表示分离,使得可以独立地构建不同表示的对象。这样可以简化构建过程,提高可读性和维护性。

  2. 提供灵活的构建方式:通过定义不同的Builder或者使用方法链式调用,可以按需设置对象的各个属性,从而灵活地构建对象。可以根据需要组合不同的属性,生成不同的对象实例。

  3. 支持构建过程的逐步完善:Builder模式可以支持逐步完善构建过程,即在Builder中逐步添加设置方法,最后调用build方法返回最终的对象。这种方式可以方便地扩展构建过程,适应不同的需求。

  4. 避免构造函数参数过多:当一个类的构造函数参数过多时,使用Builder模式可以避免构造函数的参数列表过长,提高代码的可读性。

Builder模式的一些缺点

  1. 增加了类的复杂度:引入了Builder类和多个setter方法,增加了类的复杂度和代码量。

  2. 对象构建过程的冗余:Builder模式会创建一个Builder对象来构建目标对象,可能会导致额外的对象创建开销。

  3. 不适用于简单对象:如果目标对象的属性较少,构建过程相对简单,使用Builder模式可能不是最优选择,会增加代码量和复杂度。

需要根据具体情况来权衡使用Builder模式的利弊。在复杂对象的构建过程中,特别是当对象具有大量属性或者构建过程需要逐步完善时,Builder模式可以提供一种灵活、可读性高的解决方案。

3、建造者Builder模式的应用场景

  1. 构建复杂对象:当需要构建的对象具有多个属性,并且构建过程较为复杂时,可以考虑使用Builder模式。例如,构建包含大量配置选项的文档生成器、图形界面中的复杂组件等。

  2. 避免重叠构造函数:当一个类需要多个构造函数来支持不同的对象初始化方式时,可以使用Builder模式来避免创建过多的重叠构造函数,并提供更清晰的对象构建方法。

  3. 创建不可变对象:当需要创建不可变(Immutable)对象时,Builder模式可以很好地与不可变对象的设计原则结合,通过Builder来设置对象的属性,最终构建出不可变的对象实例。

  4. 流式接口(Fluent Interface):Builder模式可以用于创建流式接口,使得客户端代码可以使用链式调用的方式来设置对象的属性,从而提高代码的可读性和简洁性。

  5. 多个构建过程:当需要支持多种构建过程,或者需要逐步完善构建过程时,Builder模式可以提供一种灵活的解决方案,支持根据不同需求构建不同表示的对象。

总的来说,Builder模式适用于需要构建复杂对象、有多个可选参数或需要逐步完善构建过程的情况。通过使用Builder模式,可以将对象的构建过程分离出来,提高灵活性和可读性。

4、建造者模式中的指导者(Director)有什么作用?

在建造者模式中,指导者(Director)起到了协调和组织的作用。它负责控制构建过程,按照特定的顺序调用建造者的方法来构建对象。

指导者的主要作用有以下几点:

  1. 定义构建顺序:指导者确定了构建过程中各个步骤的顺序和调用方式。它知道哪些方法应该在何时被调用,以保证对象的正确构建。

  2. 解耦客户端与具体构建过程:指导者将构建对象的过程封装起来,并与具体的建造者解耦。客户端不需要直接与建造者进行交互,而是通过指导者来完成对象的构建。

  3. 简化客户端代码:指导者隐藏了构建细节,使得客户端可以更简洁地调用构建过程。客户端只需要与指导者进行交互,并传递必要的参数,而无需关心具体的构建过程。

指导者的实现原理通常是通过将建造者作为参数进行注入,并在内部调用建造者的方法来完成构建过程。指导者根据具体需求和建造者的能力来决定调用哪些方法以及调用顺序。

具体实现上,指导者可以提供一个统一的构建方法,接收建造者作为参数,并按照预定的顺序调用建造者的方法来构建对象。也可以根据需要提供一系列的构建方法,每个方法负责调用建造者的特定方法,以完成特定的构建步骤。

通过指导者的存在,客户端可以更简单地调用构建方法,而无需关心具体的构建细节和顺序,从而实现了构建过程的解耦和简化。

5、建造者Builder模式与其他模式的关系

该片段引自:Builder

1. 许多设计从使用Factory方法(不那么复杂,通过子类更可定制)开始,并向抽象工厂、原型或生成器(更灵活,但更复杂)发展。
2. Builder专注于逐步构建复杂的对象。抽象工厂专门创建相关对象的族。Abstract Factory会立即返回产品,而Builder允许在获取产品之前运行一些额外的构造步骤
3. 在创建复杂的复合树时可以使用Builder,因为可以对其构建步骤进行编程以递归工作。
4. 您可以将Builder和Bridge结合起来:director类扮演抽象的角色,而不同的构建器充当实现。
5. 抽象工厂、构建者和原型都可以实现为Singleton。

小结

Builder 模式的关键是其中的 Director 对象并不直接返回对象,而是通过分步进行对象的创建。在这里 Director 可以提供一个默认的返回对象的接口(即返回通用的复杂对象的创建,不指定或者特定唯一指定BuildPart中的参数)。

通过使用Builder模式,可以避免在构造函数或者setter方法中传入大量参数,并且可以更加清晰地组织和管理复杂对象的构建过程。

参考:

精讲设计模式-Builder模式-CSDN博客

设计模式-生成器(Builder) - 知乎

大白话建造者模式(Builder Pattern) - 张有路 - 博客园

Builder

设计模式系列3 - builder模式 - 知乎


感谢阅读,码字不易,多谢点赞!如有不当之处,欢迎反馈指出,感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1244719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

某60区块链安全之未初始化的存储指针实战一学习记录

区块链安全 文章目录 区块链安全未初始化的存储指针实战一实验目的实验环境实验工具实验原理实验过程 未初始化的存储指针实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约未初始化的存储指针漏洞 找到合约漏洞进行分析并形成利用 实验环境 Ubuntu18.04操…

飞书智能伙伴之 AI 数智参谋:先进团队,北极星指标也要遥遥领先

11 月 22 日,飞书在 2023 秋季飞书未来无限大会上正式发布了飞书智能伙伴。作为首批生态伙伴,基于 Kyligence 智能一站式指标平台实现的 AI 数智参谋也正式亮相。这是继 11 月 21 日 Kyligence 产品发布会后,Kyligence 在数据驱动决策智能领域…

python之pyqt专栏1-环境搭建

#python pyqt# python:3.11.6 pycharm:PyCharm Community Edition 2023.2.5 pyqt6 python安装 官网下载:Python Releases for Windows | Python.org pycharm社区版安装 官网地址:Download PyCharm: Python IDE for Professional…

CUDA与GPU编程

文章目录 CUDA与GPU编程1. 并行处理与GPU体系架构1.1 并行处理简介1.1.1 串行处理与并行处理的区别1.1.2 并行处理的概念1.1.3 常见的并行处理 1.2 GPU并行处理1.2.1 GPU与CPU并行处理的异同1.2.2 CPU的优化方式1.2.3 GPU的特点 1.3 环境搭建 CUDA与GPU编程 1. 并行处理与GPU体…

思维模型 潘多拉效应

本系列文章 主要是 分享 思维模型 ,涉及各个领域,重在提升认知。越是禁止,越是好奇。 1 潘多拉效应的应用 1.1 潘多拉效应在管理中的应用 通用电气公司曾经推出了一项名为“六西格玛”的管理方法,该方法旨在通过优化业务流程和提…

土地利用数据技术服务

一、背景介绍 土地是人类赖以生存与发展的重要资源和物质保障,在“人口-资源-环境-发展(PRED)”复合系统 中,土地资源处于基础地位。随着现代社会人口的不断增长以及工业化、城市化进程的加速&a…

所有权成果输出(宗地基本信息表、界址标示表、界址签章表、界址点成果表、宗地图、界址说明表、调查审核表)

一、软件界面: 二、软件功能:主要实现批量生成不动产权籍调查表、宗地基本信息表、界址标示表、界址签章表、界址点成果表、宗地图、界址说明表、调查审核表。(本次宗地包含内外环宗地) 三、所有权成果要求(宗地基本信息表、界址标示表、界址签章表…

创作4周年

🙌秋名山码民的主页 😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 获取源码,添加WX 目录 前言机…

工业一体全国产方案,米尔T113核心板

入门级HMI屏作为嵌入式系统中重要组成部分,大部分都是串口屏;其功能简单、成本低等特点,使用历史悠久、应用广泛,而随着信息技术的快速发展,行业需求不断升级,工程师使用了大量串口屏后,发现串口…

操作系统 day13(RR、优先级调度)

RR(时间片轮转) 响应时间:系统中有10个进程正在并发执行,如果时间片为1秒,则一个进程被响应可能需要等待9秒。也就是说,如果用户在自己进程的时间片外通过键盘发出调试命令,可能需要等待9秒才能…

大厂面试官最爱问的20道Mysql面试题

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

thinkphp6生成PDF自动换行

composer安装 composer require tecnickcom/tcpdf 示例 use TCPDF;public function info($university,$performance,$grade,$major){//获取到当前域名$domain request()->domain();//实例化$pdf new TCPDF(P, mm, A4, true, UTF-8, false);// 设置文档信息$pdf->SetCr…

Redis高可用之主从复制及哨兵模式

一、Redis的主从复制 1.1 Redis主从复制定义 主从复制是redis实现高可用的基础,哨兵模式和集群都是在主从复制的基础之上实现高可用; 主从复制实现数据的多级备份,以及读写分离(主服务器负责写,从服务器只能读) 1.2 主从复制流…

多线程的实现方式

点击链接返回标题-> Java线程的学习-CSDN博客 第一种方式,继承Thread类 Thread类是java.lang包下的类,是多线程经常需要使用的类。 ①通过自定义子类去继承Thread类,并重写其中的run()方法。 class myThread extends Thread {//自定义子类…

hive return code 40000 from org.apache.hadoop.hive.ql.exec.MoveTask解决思路

参考学习 https://github.com/apache/hive/blob/2b57dd27ad61e552f93817ac69313066af6562d9/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java#L47 为啥学习error code 开发过程中遇到以下错误,大家觉得应该怎么办?从哪方面入手呢? 1.百…

51单片机利用I/O口高阻状态实现触摸控制LED灯

51单片机利用I/O口高阻状态实现触摸控制LED灯 1.概述 这篇文章介绍使用I/O口的高阻状态实现一个触摸控制LED灯亮灭的实验。该实验通过手触摸P3.7引脚,改变电平信号控制灯的亮灭。 2.实验过程 2.1.实验材料 名称型号数量单片机STC12C20521LED彩灯无1晶振12MHZ1电…

【git】使用ssh

前言 git之前一直使用https,因为很方便随时随地都可以用。最近把代码托管到GitHub,使用https就使用不了。后面听同事说GitHub使用ssh是没问题的,就想着尝试一下。 git ssh配置 设置用户名和邮箱 git config --global use.name username g…

一条Update语句的执行过程是怎样的?

先看第一个问题,这里做个简单描述 ,因为我们着重还是看Update MySQL执行一条Select语句是怎么运行的? 这个问题大家在面试的时候大家都背过类似的题,而且网上也有很多答案,这里分享一个大致流程介绍,关于…

通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示

通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示 #include <ros/ros.h> #include <signal.h> #include <sensor_msgs/Image.h> #include <message_filters/subscriber.h> #include <message_filters/synchronizer.h> #include &…

国外网站文章或网页采集翻译为中文

采集国外网站的文章或网页数据&#xff08;例如英文&#xff0c;西班牙语&#xff0c;法语等&#xff09;&#xff0c;怎么快速批量翻译为中文&#xff1f; 可以使用简数采集器来实现&#xff0c;支持自动翻译&#xff0c;同时翻译为多种语言&#xff08;不仅中文&#xff09;…