【设计模式】建造者模式

devtools/2024/9/19 8:43:19/ 标签: 设计模式, 建造者模式, java

建造者模式是一种对象创建型设计模式,它将一个复杂对象的构建过程与其表示分离。

文章目录

这意味着客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。

在这里插入图片描述

建造者模式的结构通常包括以下几个关键部分:

  1. Director(指导者):负责指导构建过程的顺序,它并不直接创建产品,而是通过建造者来构建产品。指导者与抽象建造者之间存在关联关系,可以在其构造方法或方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。
  2. Builder(抽象建造者):定义了创建产品各个部分的抽象接口,一般声明两类方法,一类方法是用于创建复杂对象的各个部件,另一类方法是用于返回复杂对象。Builder 既可以是抽象类,也可以是接口。
  3. ConcreteBuilder(具体建造者):实现了 Builder 接口,负责具体产品的构建过程,定义并明确所创建的复杂对象,还可以提供一个方法返回创建好的复杂产品对象。
  4. Product(产品):表示最终构建出的复杂对象,它通常包含了多个部分。

JAVA实现案例

建造者模式适用于构建具有复杂配置的对象,例如具有多个可选组件的汽车、电脑等。其优点在于建造者独立,易扩展,便于控制细节风险;缺点是产品必须有共同点,范围有限制,如内部变化复杂,会有很多的建造类。在实际应用中,如 Java 中的 StringBuilder 就是建造者模式的体现。通过将复杂对象的构建过程进行封装,使用建造者模式可以提高代码的可维护性和可扩展性,使得构建复杂对象的过程更加清晰和可控。

建造者模式在实际软件中的应用案例

在实际的软件设计中,建造者模式有诸多应用场景。例如,在汽车制造领域,一辆汽车由发动机、底盘、车身、内饰等多个复杂部件组成。通过建造者模式,我们可以将汽车的各个部件的构建过程与最终的装配过程分离。抽象建造者定义了创建汽车部件的接口,具体建造者负责实现具体部件的创建,指挥者则协调各个部件的构建和装配顺序,从而实现不同配置和型号的汽车生产。

再比如在软件开发中,构建复杂的用户界面时也能应用建造者模式。一个用户界面可能包含多个元素,如菜单、工具栏、状态栏、主窗口内容等。抽象建造者规定了创建这些界面元素的方法,具体建造者实现具体元素的创建,指挥者负责按照特定顺序和规则将这些元素组合成完整的用户界面。

在数据库操作中,构建复杂的查询语句也可以使用建造者模式。抽象建造者定义了构建查询条件、连接表、排序规则等部分的接口,具体建造者实现具体的构建逻辑,指挥者根据业务需求协调这些部分的组合,最终生成符合要求的查询语句。

Director 在建造者模式中的作用原理

Director(指挥者)在建造者模式中扮演着重要的角色。它主要有两个关键作用:

  • 其一,它隔离了客户与复杂的生产过程。客户无需直接了解产品的具体构建细节,只需要与指挥者进行交互,指定所需的产品类型和相关配置。这使得客户的操作更加简洁和直观,降低了客户的使用难度和出错概率。

  • 其二,Director 负责控制产品的生成过程。它决定了产品各部分的构建顺序、哪些部分需要构建以及如何进行组装。通过精心设计的指挥流程,Director 能够确保产品的构建过程高效、准确,并符合特定的业务规则和需求。

例如,在构建一个复杂的软件系统时,Director 可以根据不同的场景和需求,灵活地安排各个模块的构建顺序和组合方式。又比如在制造复杂的工业产品时,Director 可以根据订单要求,指挥建造者按照特定的规格和工艺来生产产品。

Builder 接口的设计要点

Builder 接口的设计是建造者模式的关键之一。在设计 Builder 接口时,需要明确以下几个要点:

  • 首先,接口中应清晰定义创建产品各个部分的方法。这些方法要具有明确的职责和功能,以便具体的建造者能够准确地实现。例如,如果要构建一个房屋对象,Builder 接口可能包含创建地基、墙壁、屋顶等部分的方法。

  • 其次,接口中的方法应该具有良好的可扩展性。随着业务的发展和需求的变化,可能需要添加新的部件构建方法。因此,在设计时要预留扩展的空间,避免因新增部件而导致接口的大幅修改。

  • 另外,Builder 接口还应该考虑到参数的合理性和灵活性。方法的参数应该能够准确传递构建部件所需的信息,同时又不过于复杂,以保证使用的便利性。

  • 最后,Builder 接口要定义一个获取最终构建结果的方法。这个方法能够将各个部分组合成完整的产品并返回,以便客户端获取和使用。

例如,在设计一个文档生成器的 Builder 接口时,可以包含设置文档标题、正文内容、字体样式等方法,同时提供一个获取完整文档对象的方法。

在这里插入图片描述

如何优化建造者模式中的 Director 和 Builder 协作

为了优化建造者模式中 Director 和 Builder 的协作,可以从以下几个方面入手:

  • 一是明确职责分工。确保 Director 专注于控制构建流程和顺序,而 Builder 专注于具体部件的构建。避免职责不清导致的混乱和效率低下。

  • 二是优化通信机制。建立高效、简洁的通信方式,使 Director 能够准确地向 Builder 传达构建需求和指令,Builder 能够及时向 Director 反馈构建进度和问题。

  • 三是引入缓存和复用机制。对于一些常见的构建过程或已经构建好的部件,可以进行缓存和复用,以提高构建效率。

  • 四是进行性能优化。例如,对构建过程中的耗时操作进行优化,或者采用并行构建的方式提高构建速度。

  • 五是增强灵活性。支持动态调整构建流程和部件配置,以适应不同的业务需求和变化。

比如,在一个大型系统的构建中,可以根据系统的负载情况动态调整构建的并行度;或者在构建过程中,根据用户的实时需求动态更改产品的某些部件配置。


Java代码实现

以下是一个使用 Java 实现建造者模式的示例,用于构建一个Computer对象:

java">class Computer {private String cpu;private String ram;private String hardDisk;// 构造函数私有化,防止外部直接创建对象private Computer(Builder builder) {this.cpu = builder.cpu;this.ram = builder.ram;this.hardDisk = builder.hardDisk;}// 获取属性的方法public String getCpu() {return cpu;}public String getRam() {return ram;}public String getHardDisk() {return hardDisk;}// 静态内部类Builderpublic static class Builder {private String cpu;private String ram;private String hardDisk;// 设置 CPU 的方法public Builder setCpu(String cpu) {this.cpu = cpu;return this;}// 设置内存的方法public Builder setRam(String ram) {this.ram = ram;return this;}// 设置硬盘的方法public Builder setHardDisk(String hardDisk) {this.hardDisk = hardDisk;return this;}// 构建 Computer 对象的方法public Computer build() {return new Computer(this);}}@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", ram='" + ram + '\'' +", hardDisk='" + hardDisk + '\'' +'}';}
}public class BuilderPatternExample {public static void main(String[] args) {Computer computer = new Computer.Builder().setCpu("Intel Core i7").setRam("16GB").setHardDisk("1TB SSD").build();System.out.println(computer);}
}

在上述代码中:

  • Computer类是要构建的产品类,它有cpuramhardDisk等属性。

  • Builder是一个静态内部类,用于逐步设置Computer对象的属性,并提供build方法来构建最终的Computer对象。

  • Director的角色在这个示例中体现得不是很明显,在实际场景中,如果有对构建过程的更复杂控制逻辑,可以单独创建一个类来充当Director的角色。

实现案例2


复习

一、建造者模式(Builder Pattern)的定义

建造者模式是一种创建对象的设计模式,它将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式中,有一个导演(Director)类和一个建造者(Builder)抽象类及其具体的建造者子类。导演类负责控制构建产品的流程,而具体的建造者子类负责实现产品的具体构建过程。

在这里插入图片描述

二、建造者模式的意义和解决的问题

  1. 分离对象的构建和表示

    • 使得构建复杂对象的代码更加清晰、易读和可维护。当一个对象的构建过程非常复杂,涉及多个步骤和多种配置时,如果将这些构建逻辑直接放在对象的构造函数中,会使构造函数变得庞大且难以理解和维护。使用建造者模式,可以将构建逻辑分离到不同的建造者类中,使每个类专注于自己的构建任务。
  2. 支持对象的灵活构建

    • 可以根据不同的需求创建具有不同内部表示的对象。例如,在构建一个汽车对象时,可以有不同的建造者来创建经济型汽车、豪华型汽车等,它们的构建过程和配置可能不同,但最终都能得到一个完整的汽车对象。
  3. 更好的控制构建过程

    • 导演类可以精确地控制对象的构建步骤和顺序,确保对象的构建过程按照预期进行。这对于需要严格遵循一定流程和规则来构建对象的场景非常有用。

三、深层次的哲学意义

从哲学角度来看,建造者模式体现了以下几个方面的思考:

  1. 分工与协作

    • 建造者模式将对象的构建过程分解为不同的角色(导演和建造者),每个角色专注于自己的职责,通过协作完成对象的构建。这反映了在复杂系统中,分工与协作是提高效率、保证质量和实现复杂功能的重要方式。
  2. 解耦与分离

    • 将对象的构建过程与对象的表示分离,体现了一种解耦的思想。在现实世界中,事物的生产过程和最终形态往往是可以分离的,这种分离可以使生产过程更加灵活、可扩展,并且便于对生产过程进行优化和改进。
  3. 变化与稳定

    • 导演类控制着稳定的构建流程,而不同的建造者可以根据需求进行变化和扩展,以构建出不同的对象。这体现了在变化的需求和环境中,寻找稳定的架构和流程,同时又能够灵活地适应变化的哲学思想。

总之,建造者模式在软件设计中不仅是一种解决对象构建问题的技术手段,还蕴含了对系统设计、分工协作、解耦分离和应对变化等方面的深刻思考和实践指导。

——

【完】


http://www.ppmy.cn/devtools/85424.html

相关文章

Vs2022+QT+Opencv 一些需要注意的地方

要在vs2022创建QT项目,先要安装一个插件Qt Visual Studio Tools,根据个人经验选择LEGACY Qt Visual Studio Tools好一些,看以下内容之前建议先在vs2022中配置好opencv,配置方式建议以属性表的形式保存在硬盘上。 设置QT路径 打开v…

PHP超级全局变量

PHP 中的超级全局变量(Superglobals)是 PHP 4.1.0 引入的一个特性,它们在脚本的全部作用域中都是可用的。这意味着一旦一个脚本被载入,这些变量就可以在脚本的任何地方被访问,无论是在函数内部还是外部。PHP 提供了几个…

深度学习系列70:模型部署torchserve

1. 流程说明 ts文件夹下, 从launcher.py进入,执行jar文件。 入口为model_server.py的start()函数。内容包含: 读取args,创建pid文件 找到java,启动model-server.jar程序,同时读取log-config文件&#xff…

gstreamer使用cairo实现视频OSD叠加

前言 gstreamer中视频叠加OSD有很多种方式,比如textoverlay添加文字,gdkpixbufoverlay添加图片,clockoverlay或timeoverlay插件显示时间,pango插件进行复杂文本渲染,使用cairo插件绘制图形或者文字。 今天使用最后一…

【Android】安卓四大组件之广播知识总结

文章目录 动态注册使用BroadcastReceiver监听Intent广播注册Broadcast Receiver 静态注册自定义广播标准广播发送广播定义广播接收器注册广播接收器 有序广播修改发送方法定义第二个广播接收器注册广播接收器广播截断 使用本地广播实践-强制下线使用ActivityCollector管理所有活…

[极客大挑战 2019]BabySQL1

这是上一个SQL注入的升级版,首先打开靶机 有了上次的经验,我们直接联合查询:?usernameaaaunion select null,null,null#&password1234 看报错信息,null,null,null#有错误,猜测select被过滤…

【C++】特殊类的设计

目录 类的对象只能在堆上创建 类的对象只能在栈上创建 类只能创建一个对象(单例模式) 饿汉 懒汉 本篇博客就是说给一个需求,然后根据需求和类的一些语法规则设计出符合要求的类,比如说我们之前的不能拷贝的类:C98…

规控面试常见问题

一、项目中遇到的困难或者挑战是什么? 二、A*算法原理(伪代码) 输入:代价地图、start 、 goal(Node结构,包含x、y、g、h、id、pid信息) 首先初始化:创建一个优先级队列openlist,它是一个最小堆,根据节点的f值排序 ( priority_queue<Node, std::vector<Node…

Python 代码中的 yield 到底是什么鬼?

在Python编程中&#xff0c;有一个强大而神秘的关键字&#xff0c;那就是yield。初学者常常被它搞得晕头转向&#xff0c;而高级开发者则借助它实现高效的代码。到底yield是什么&#xff1f;它又是如何在Python代码中发挥作用的呢&#xff1f;让我们一起来揭开它的面纱。 Pyth…

GO-学习-03-基本数据类型

数据类型&#xff1a;基本数据类型和复合数据类型 基本数据类型&#xff1a;整型、浮点型、布尔型、字符串 复合数据类型&#xff1a;数组、切片、结构体、函数、map、通道&#xff08;channel&#xff09;、接口 整型&#xff1a; package main import "fmt" im…

JVM 21 的优化指南:如何进行JVM调优,JVM调优参数有哪些

这篇文章将详细介绍如何进行JVM 21调优&#xff0c;包括JVM 21调优参数及其应用。此外&#xff0c;我将提供12个实用的代码示例&#xff0c;每个示例都会结合JVM启动参数和Java代码。 本文已收录于&#xff0c;我的技术网站 java-broke.site&#xff0c;有大厂完整面经&#x…

开普勒优化算法( KOA)及其Python和MATLAB实现

### 开普勒优化算法&#xff08;Kepler Optimization Algorithm, KOA&#xff09; #### 一、背景 在复杂问题解决和优化领域&#xff0c;传统的优化方法如梯度下降法、遗传算法等&#xff0c;虽然在某些问题上取得了良好的效果&#xff0c;但在处理高度非线性、复杂的多峰优化…

微软蓝屏事件:全球IT基础设施的韧性考验与未来展望

在数字化时代&#xff0c;信息技术的飞速发展极大地推动了社会进步与产业升级&#xff0c;但同时也让全球IT基础设施的韧性与安全性面临着前所未有的挑战。近日&#xff0c;一场由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅震撼了整个科技界&#xff0…

【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能

审核看清楚了 &#xff01; 这是以太坊测试网络&#xff01;用于学习的测试网络&#xff01;&#xff01;&#xff01; 有关web3 和区块链的内容为什么要给我审核不通过&#xff1f; 别人凭什么可以发&#xff01; 目标成果&#xff1a; 实现功能分析&#xff1a; 显示账户信…

设计模式总结:适配器、桥接、组合和迭代器模式

在之前的对话中&#xff0c;我们讨论了五种常见的 Java 设计模式&#xff1a;单例、工厂、策略、装饰器和观察者模式。现在&#xff0c;让我们继续探索其他四种设计模式&#xff1a;适配器、桥接、组合和迭代器模式。 适配器模式 概念&#xff1a; 适配器模式是一种结构型设计…

Linux搭建Kubernetes集群(单Master)【附图文】

文章目录 一、集群环境配置要求二、主机准备三、初始环境准备1.修改主机名和host文件2.关闭防火墙3.关闭 selinux4.关闭swap4.加载 br_netfilter 模块5.允许iptables转发流量6.设置时间同步 四、安装Docker五、安装kubeadm, kubectl, kubelet六、在Master节点部署集群七、将 no…

算法刷题笔记 堆优化版的Dijkstra算法求最短路(C++实现。包含详细思路分析和对C++中priority_queue的介绍)

文章目录 题目描述基本思路实现代码 题目描述 给定一个n个点m条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为非负值。请你求出1号点到n号点的最短距离&#xff0c;如果无法从1号点走到n号点&#xff0c;则输出−1。 输入格式 第一行包含整数n和m。…

Docker安全管理与HTTPS协议

1 Docker容器的安全管理注意事项 Docker本身的架构与机制就可能产生问题&#xff0c;例如这样一种攻击场景&#xff0c;黑客已经控制了宿主机上的一些容器&#xff0c;或者获得了通过在公有云上建立容器的方式&#xff0c;然后对宿主机或其他容器发起攻击。 1. 容器之间的局…

python-爬虫实例(4):获取b站的章若楠的视频

目录 前言 道路千万条&#xff0c;安全第一条 爬虫不谨慎&#xff0c;亲人两行泪 获取b站的章若楠的视频 一、话不多说&#xff0c;先上代码 二、爬虫四步走 1.UA伪装 2.获取url 3.发送请求 4.获取响应数据进行解析并保存 总结 前言 道路千万条&#xff0c;安全第一条 爬…

数据库实验:SQL Server创建数据库及基本表

一、实验目的&#xff1a; 1、掌握使用SQL SERVER Management Studio工具连接数据库引擎&#xff1b; 2、掌握使用CREATE TABLE 创建基本表的用法&#xff1b; 3、掌握使用ALTER TABLE 修改基本表的用法&#xff1b; 4、掌握使用DROP TABLE删除基本表的用法&#xff1b; 二…