设计模式 创建型 建造者模式(Builder Pattern)与 常见技术框架应用 解析

在这里插入图片描述

单例模式(Singleton Pattern),又称生成器模式,是一种对象构建模式。它主要用于构建复杂对象,通过将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建出具有不同表示的对象。该模式的核心思想是将一个复杂对象的构建过程分解为多个简单的步骤,并允许用户通过指定复杂对象的类型和内容来构建它们,而无需知道对象内部的具体构建细节。

一、核心思想

建造者模式的核心思想是将复杂对象的构建过程与它的表示分离,使得构建过程可以灵活地组合,而不会影响最终的产品表示。这有助于创建一个逐步构建的复杂对象,同时隐藏其内部构造细节。

二、定义与结构

  • 定义:建造者模式是一种创建型设计模式,它允许将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。通过将对象的构建过程分解为一系列步骤,由不同的建造者类来实现这些步骤,最后由指挥者类来统筹构建流程,以得到最终的复杂对象。
  • 结构
    • 产品(Product):即要构建的复杂对象,它具有多个组成部分,这些部分通常由建造者逐步构建完成。例如上述的定制电脑,它就是产品,包含 CPU、内存等各种硬件组件作为其内部属性。
    • 抽象建造者(Abstract Builder):定义了构建产品各个部分以及返回最终产品的抽象方法,为具体建造者提供统一的接口规范。比如定义了安装 CPU、安装内存等抽象操作方法。
    • 具体建造者(Concrete Builder):实现抽象建造者接口,负责按照特定的需求实际构建产品的各个部分,并在最后返回构建完成的产品。例如,高性能电脑建造者会选择高端的 CPU、大容量内存来组装电脑。
    • 指挥者(Director):负责指挥和协调建造者的构建步骤,它知晓构建产品所需的完整流程,通过调用建造者的方法来实现产品的构建,但它并不负责具体的构建细节,只是掌控构建的节奏。比如指挥者决定先安装哪个部件,后安装哪个部件。

角色

  • 产品角色(Product):作为建造的目标对象,它承载了复杂对象的所有属性和状态,是建造者们努力打造的成果,通常是一个包含多个成员变量的类,这些变量代表了对象的不同组成部分。
  • 抽象建造者角色(Abstract Builder):作为建造者的抽象模板,规定了构建产品必须实现的一组抽象方法,这些方法涵盖了从基础部件安装到最终产品组装成型的各个环节,为具体建造者的实现提供了方向指引。
  • 具体建造者角色(Concrete Builder):依据抽象建造者的蓝图,深入到实际构建工作的第一线,根据特定的设计要求或用户需求,精心挑选合适的部件,运用专业的技术,将一个个零散的部件逐步组装成完整的产品,并且能够将最终成果交付给客户端。
  • 指挥者角色(Director):站在更高的层面统筹规划,它熟悉整个构建流程的最优顺序,通过向具体建造者下达精准的指令,协调各个建造者之间的工作衔接,确保复杂对象能够高效、有序地构建完成,虽然不直接参与物理构建,但却掌控着构建的全局节奏。

三、实现步骤及代码示例(以构建一个网页表单为例)

1、定义产品

// 产品:网页表单
public class WebForm {private String formTitle;private String formFields;private String submitButtonText;public WebForm(String formTitle, String formFields, String submitButtonText) {this.formTitle = formTitle;this.formFields = formFields;this.submitButtonText = submitButtonText;}// 省略 getters 和 setters,方便展示主要逻辑@Overridepublic String toString() {return "WebForm{" +"formTitle='" + formTitle + '\'' +"formFields='" + formFields + '\'' +"submitButtonText='" + submitButtonText + '\'' +'}';}
}

2、定义抽象建造者

// 抽象建造者:网页表单建造者
public abstract class WebFormBuilder {protected WebForm webForm;public WebForm getWebForm() {return webForm;}public abstract void buildFormTitle();public abstract void buildFormFields();public abstract void buildSubmitButtonText();
}

3、创建具体建造者

// 具体建造者:登录表单建造者
public class LoginFormBuilder extends WebFormBuilder {@Overridepublic void buildFormTitle() {webForm = new WebForm("Login Form", "", "");}@Overridepublic void buildFormFields() {webForm.setFormFields("Username: <input type='text' name='username'><br>Password: <input type='password' name='password'>");}@Overridepublic void buildSubmitButtonText() {webForm.setSubmitButtonText("Login");}
}// 具体建造者:注册表单建造者
public class RegistrationFormBuilder extends WebFormBuilder {@Overridepublic void buildFormTitle() {webForm = new WebForm("Registration Form", "", "");}@Overridepublic void buildFormFields() {webForm.setFormFields("Username: <input type='text' name='username'><br>Password: <input type='password' name='password'><br>Email: <input type='email' name='email'>");}@Overridepublic void buildSubmitButtonText() {webForm.setSubmitButtonText("Register");}
}

4、再定义指挥者:

// 指挥者:表单指挥者
public class FormDirector {private WebFormBuilder webFormBuilder;public FormDirector(WebFormBuilder webFormBuilder) {this.webFormBuilder = webFormBuilder;}public WebForm construct() {webFormBuilder.buildFormTitle();webFormBuilder.buildFormFields();webFormBuilder.buildSubmitButtonText();return webFormBuilder.getWebForm();}
}

5、在客户端代码中使用

public class Main {public static void main(String[] args) {// 构建登录表单LoginFormBuilder loginFormBuilder = new LoginFormBuilder();FormDirector formDirector = new FormDirector(loginFormBuilder);WebForm loginForm = formDirector.construct();System.out.println(loginForm);// 构建注册表单RegistrationFormBuilder registrationFormBuilder = new RegistrationFormBuilder();formDirector = new FormDirector(registrationFormBuilder);WebForm registrationForm = formDirector.construct();System.out.println(registrationForm);}
}

四、常见技术框架应用

建造者模式(Builder Pattern)是一种创建型设计模式,它通过将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式的优点在于能够分步骤构建复杂对象,而无需关注这些部分的具体组装过程,从而提高了代码的灵活性和可扩展性。关于建造者模式在技术框架中的应用,虽然具体的应用场景可能因框架而异,但以下是一些常见的技术框架和领域中建造者模式的应用示例:

1、Java EE和Spring框架

在Java EE和Spring等企业级应用框架中,建造者模式常用于构建具有复杂属性和依赖关系的对象。例如,在构建数据库连接池、消息队列连接等复杂对象时,可以使用建造者模式来逐步设置对象的属性,并最终返回一个配置好的实例。

2、Web开发框架

在Web开发中,建造者模式常用于构建HTTP请求和响应对象。这些对象通常包含多个属性和配置选项,如URL、请求方法、头信息、请求体等。通过建造者模式,可以逐步设置这些属性,而不是在构造函数中一次性传递所有参数。

3、图形用户界面(GUI)框架

在构建复杂的GUI组件时,如窗口、按钮、文本框等,建造者模式可以帮助开发者逐步设置组件的属性,如大小、位置、颜色等。这样不仅可以提高代码的可读性,还可以使组件的创建过程更加灵活和可扩展。

4、游戏开发框架

在游戏开发中,建造者模式常用于构建游戏中的角色、道具、场景等复杂对象。通过建造者模式,可以逐步设置这些对象的属性,如生命值、攻击力、防御力等,并最终生成一个完整的游戏对象。

5、配置和初始化框架

在一些配置和初始化框架中,建造者模式常用于构建配置对象。这些配置对象通常包含多个配置项和依赖关系,通过建造者模式可以逐步设置这些配置项,并最终生成一个配置好的实例。

在 Android 开发中,AlertDialog 的创建就运用了类似建造者模式的思想。

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;public class DialogBuilderExample {public static void main(String[] args) {Context context = null; // 实际开发中需替换为有效的上下文AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setTitle("提示").setMessage("这是一个示例对话框").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 点击确定按钮的处理逻辑}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@@Overridepublic void onClick(DialogInterface dialog, int which) {// 点击取消按钮的处理逻辑}});AlertDialog dialog = builder.create();dialog.show();}
}

这里,AlertDialog.Builder 相当于具体建造者,它逐步构建 AlertDialog(产品)的各个部分,如标题、消息内容、按钮等,而我们不需要关心 AlertDialog 内部复杂的创建和初始化过程,只需按照需求配置各个部件即可,最后通过 create 方法得到完整的对话框并展示。

五、应用场景

  1. 复杂对象构建:当需要创建的对象具有大量的属性、复杂的初始化逻辑,并且不同的属性组合会产生不同的功能或外观变体时,建造者模式非常适用。比如构建一辆汽车,涉及发动机、底盘、车身、内饰等多个复杂部件的选型与组装,使用建造者模式可以清晰地划分构建步骤,方便管理。
  2. 对象构建过程需要精细控制:如果对对象构建的顺序、步骤有严格要求,建造者模式能确保构建过程按照预定的流程进行。例如在建筑施工中,先打地基、再建主体、最后装修,通过指挥者精确安排建造者的工作顺序,保证建筑质量。
  3. 创建对象的逻辑频繁变化:当创建对象的逻辑需要经常调整,比如根据不同的市场需求,产品的配置、样式经常改变,建造者模式将构建逻辑封装在建造者和指挥者类中,修改时只需在相关类中进行,不影响客户端使用。

六、优缺点

优点

  1. 构建过程与表示分离:使得客户端不需要了解复杂对象的具体构建细节,降低了耦合度,客户端只需与指挥者和建造者的抽象接口交互,即使构建过程变化,也不影响客户端代码。
  2. 精细控制构建过程:通过指挥者可以精确安排构建步骤,满足不同的构建需求,确保复杂对象按照预期的方式构建,提高构建质量。
  3. 代码复用性高:抽象建造者和具体建造者类可以在多个地方复用,尤其是当有多种类似的复杂对象需要构建时,复用建造者类能节省开发时间。例如,不同风格的房屋建造可以复用基础的建造者类。
  4. 便于维护和扩展:当需要增加新的构建步骤、修改构建逻辑或创建新的复杂对象变体时,只需在建造者和指挥者类中操作,不会影响其他部分代码。如要给汽车增加自动驾驶功能模块,只需在相关建造者类中添加构建步骤。

缺点

  1. 增加代码复杂性:引入建造者模式会增加类的数量,包括抽象建造者、具体建造者、指挥者以及产品类,对于简单的对象创建场景,会使代码显得过于繁琐。
  2. 对开发人员要求较高:要求开发人员熟悉建造者模式的结构和原理,在设计和实现过程中需要合理规划各个角色的职责和交互,否则容易导致代码混乱,增加维护难度。

建造者模式为创建复杂对象提供了一种高效、灵活且易于维护的解决方案,虽然在简单场景下可能略显繁琐,但在应对复杂构建需求时能充分发挥其优势,提升软件的质量和开发效率。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是Redis哨兵机制?

大家好&#xff0c;我是锋哥。今天分享关于【什么是Redis哨兵机制&#xff1f;】面试题。希望对大家有帮助&#xff1b; 什么是Redis哨兵机制&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 哨兵&#xff08;Sentinel&#xff09;机制是 Redis 提…

全国计算机设计大赛大数据主题赛(和鲸赛道)经验分享

全国计算机设计大赛大数据主题赛&#xff08;和鲸赛道&#xff09;经验分享 这是“和鲸杯”辽宁省普通高等学校本科大学生计算机设计竞赛启动会汇报—大数据主题赛的文档总结。想要参加2025年此比赛的可以借鉴。 一、关于我 人工智能专业 计赛相关奖项&#xff1a; 2022年计…

STM32 + 移远EC800 4G通信模块数传

一、4G模块简述 EC800M-CN 是移远通信&#xff08;Quectel&#xff09;推出的一款高性能、超小尺寸的 LTE Cat 1 无线通信模块&#xff0c;专为 M2M&#xff08;机器对机器&#xff09;和 IoT&#xff08;物联网&#xff09;应用设计。它具有以下主要特点&#xff1a; 通信速率…

标准库以及HAL库——按键控制LED灯代码

按键控制LED本质还是控制GPIO,和点亮一个LED灯没什么区别 点亮一个LED灯&#xff1a;是直接控制输出引脚&#xff0c;GPIO初始化推挽输出即可 按键控制LED&#xff1a;是按键输入信号从而控制输出引脚&#xff0c;GPIO初始化推挽输出一个引脚以外还得加一个GPIO上拉输入 但是…

springboot525基于MVC框架自习室管理和预约系统设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装自习室管理和预约系统软件来发挥其高效地信息处理的作用&am…

Unity Canvas中显示粒子特效

首先在场景中新建一个粒子特效 修改一下参数 1.改变粒子特效的渲染层级,层级修改为UI层,由UI相机渲染 使用粒子特效的Sorting Layer ID和Order In Layer,Sorting Layer ID设置为UI(如果没有UI层则新建就好了),对UI进行排序 对于要显示在前的UI组件添加Canvas组件,设置O…

Linux下部署Redis集群 - 一主二从三哨兵模式

三台服务器redis一主二从三哨兵模式搭建 最近使用到了redis集群部署&#xff0c;使用一主二从三哨兵集群部署redis&#xff0c;将自己部署的过程中的使用心得分享给大家&#xff0c;希望大家以后部署的过程减少一些坑。 服务器准备 3台服务器 &#xff0c;确定主redis和从red…

服务器端请求伪造之基本介绍

一.服务器端请求伪造漏洞基础 1.客户端请求 客户端请求指的是由客户端设备&#xff08;如个人计算机、智能手机、平板电脑等&#xff09;或软件&#xff08;浏览器、各种APP&#xff09;发出的请求&#xff0c;以获取指定的网页、图片、视频或其他资源。比如当用户在浏览器中输…

akamai3.0反爬教程逆向分析9个视频汇总

目录 一、akamai2.0文章二、akamai3.0每月疑似改版点二、9个视频汇总如下 一、akamai2.0文章 文章1cookie反爬之akamai_2.0-上文章2cookie反爬之akamai_2.0-上文章3cookie反爬之akamai_2.0-上文章中akamai2.0对应调试html与js文件 二、akamai3.0每月疑似改版点 详细文字与2.…

2024年12月 Scratch 图形化(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共25题,共50分) 第 1 题 小猫初始位置和方向如下图所示,下面哪个选项能让小猫吃到老鼠?( ) A. B. C.

【74LS160+74LS273DW锁存器8位的使用频率计】2022-7-12

缘由 想知道这个数字频率计仿真哪里出现错误了&#xff0c;一直无法运行哎&#xff0c;如何解决&#xff1f;-运维-CSDN问答

系统思考—信任

《基业长青》作者指出&#xff1a;“在人生的重要十字路口&#xff0c;选择信任是一场赌注。信任带来的好处可能巨大&#xff0c;而失去信任的代价却相对有限。但如果选择不信任&#xff0c;最优秀的人才可能因失望而离开。” 在企业管理中&#xff0c;信任不仅是人际关系的纽…

推理加速:投机采样经典方法

一 SpecInfer 基于模型 SpecInfer&#xff08;[2305.09781] SpecInfer: Accelerating Generative Large Language Model Serving with Tree-based Speculative Inference and Verification&#xff09; SpecInfer 投机采样利用多个小型模型&#xff08;SSM&#xff09;快速生…

深入理解Java中的Set集合:特性、用法与常见操作指南

一、HashSet集合 1.HashSet集合的特点 2.HashSet常用方法 ①&#xff1a;add(Object o)&#xff1a;向Set集合中添加元素&#xff0c;不允许添加重复数据。 ②&#xff1a;size()&#xff1a;返回Set集合中的元素个数 ③.remove(Object o)&#xff1a; 删除Set集合中的obj对…

黑马Java面试教程_P10_设计模式

系列博客目录 文章目录 系列博客目录前言1. 工厂方法模式1.1 概述1.2 简单工厂模式1.2.1 结构1.2.2 实现1.2.3 优缺点 1.3 工厂方法模式1.3.1 概念1.3.2 结构1.3.3 实现1.3.4 优缺点 1.4 抽象工厂模式1.4.1 概念1.4.2 结构1.4.3 实现1.4.4 优缺点1.4.5 使用场景 总结&#xff0…

开源架构的容器化部署优化版

上三篇文章推荐&#xff1a; 开源架构的微服务架构实践优化版&#xff08;New&#xff09; 开源架构中的数据库选择优化版&#xff08;New&#xff09; 开源架构学习指南&#xff1a;文档与资源的智慧锦囊&#xff08;New&#xff09; 我管理的社区推荐&#xff1a;【青云交社区…

SpringCloudAlibaba实战入门之Sentinel服务降级和服务熔断(十五)

一、Sentinel概述 1、Sentinel是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 一句话概括:sentinel即Hystrix的替代品,官网: https://sentinelguard.io/zh…

【每日学点鸿蒙知识】导入cardEmulation、自定义装饰器、CallState状态码顺序、kv配置、签名文件配置

1、HarmonyOS 无法导入cardEmulation&#xff1f; 在工程entry mudule里的index.ets文件里导入cardEmulation失败 可以按照下面方式添加SystemCapability&#xff1b;在src/main/syscap.json(此文件需要手动创建&#xff09;中添加如下内容 {"devices": {"gen…

Datawhale AI冬令营(第二期)动手学AI Agent--Task3:学Agent工作流搭建,创作进阶Agent

目录 一、工作流&#xff1a;制作复杂Agent的福音&#xff01; 二、支付宝百宝箱中工作流介绍 三、设计工作流 3.1 准备功能模块 3.2组合工作流 3.3 模块测试需要注意什么 3.4迭代优化 四、高中学习小助手工作流设计 4.1 选题调研 4.2 功能模块设计 4.3 组合完整工作…

Postman[8] 断言

1.常见的断言类型 status code: code is 200 //检查返回的状态码是否为200 Response body&#xff1a; contain string //检查响应中包含指定字符串包含指定的值 response body:json value check/ /检查响应中其中json的值 Response body&#xff1a; is equal to string …