创建者模式(Builder Pattern):构造复杂对象的通用解决方案

文章目录

  • **一、技术背景与应用场景**
    • **为何使用创建者模式?**
    • **典型应用场景包括但不限于:**
  • **二、创建者模式定义与结构**
  • **三、使用步骤举例**
  • 四、优缺点分析
  • 总结

一、技术背景与应用场景

创建者模式是一种对象创建型设计模式,它通过将复杂的构建过程与表示分离,使得相同的创建过程可以创建不同的表示。这种模式在面对具有多个可选组成部分和多种组合方式的对象时尤为有用,如配置文件生成、复杂查询语句构造、产品装配等。

为何使用创建者模式?

  1. 隐藏复杂性:当一个类有多个构造参数或初始化步骤比较复杂时,使用创建者模式可以避免暴露过多的构造器参数。
  2. 重用代码:不同类型的复杂对象可以通过共享相同的创建逻辑来实现代码重用。
  3. 灵活性:可以灵活地改变产品内部结构,而无需修改客户端代码。

典型应用场景包括但不限于:

  • 复杂的对象构建:如创建具有多种配置选项的产品实例。
  • XML 或 JSON 解析:根据输入数据动态构建对象树。
  • SQL 查询构造:根据用户需求拼接出复杂的 SQL 语句。

二、创建者模式定义与结构

创建者模式包含以下核心组成部分:

在这里插入图片描述

  1. Product(产品接口):声明产品的接口,这里通常是一个抽象类或者接口,定义了产品的共有属性和方法。
  2. ConcreteProduct(具体产品):实现了 Product 接口的具体产品类。
  3. Builder(抽象建造者):声明了一系列用于构建最终产品的操作,并声明了一个返回最终产品的方法 getResult
  4. ConcreteBuilder(具体建造者):继承自 Builder,实现了所有声明的构建方法,负责按顺序创建并组装产品的各个部分。
  5. Director(导演类):独立于具体建造者的角色,负责调用建造者的方法来控制产品的创建过程。

三、使用步骤举例

假设我们要构建一个简单的电脑配置类(Computer),它包含CPU、内存、硬盘等多个组成部分,而这些组成部分有不同的选择。为了更好地封装构建过程,我们将使用创建者模式来设计代码。

  1. Computer 是抽象产品,定义了所有电脑配置共有的属性和行为。

    // 抽象产品 - 电脑配置
    public abstract class Computer {protected String cpu;protected String ram;protected String hardDisk;public String getCpu() {return cpu;}public String getRam() {return ram;}public String getHardDisk() {return hardDisk;}// 抽象方法用于展示配置详情public abstract void display();
    }
    
  2. GamingComputer 是具体产品,继承自抽象产品并实现了具体的配置细节。

    // 具体产品 - 高端游戏电脑配置
    public class GamingComputer extends Computer {public GamingComputer(String cpu, String ram, String hardDisk) {super();this.cpu = cpu;this.ram = ram;this.hardDisk = hardDisk;}@Overridepublic void display() {System.out.println("Gaming Computer Configuration:");System.out.println("CPU: " + cpu);System.out.println("RAM: " + ram);System.out.println("Hard Disk: " + hardDisk);}
    }
    
  3. ComputerBuilder 是抽象建造者,声明了用来构建电脑配置的各项基本操作。

    // 抽象建造者 - 电脑配置建造者
    public abstract class ComputerBuilder {protected Computer computer;public abstract void buildCpu();public abstract void buildRam();public abstract void buildHardDisk();// 返回最终的产品public Computer getComputer() {return computer;}
    }
    
  4. GamingComputerBuilder 是具体建造者,通过覆盖抽象建造者中的方法,为高端游戏电脑配置具体的硬件组件。

    // 具体建造者 - 高端游戏电脑配置建造者
    public class GamingComputerBuilder extends ComputerBuilder {public GamingComputerBuilder() {computer = new GamingComputer("", "", "");}@Overridepublic void buildCpu() {computer.cpu = "Intel Core i9-12900K";}@Overridepublic void buildRam() {computer.ram = "32GB DDR5 RAM";}@Overridepublic void buildHardDisk() {computer.hardDisk = "1TB NVMe SSD";}
    }
    
  5. 在客户端代码中,通过调用具体建造者的构建方法,一步步构建出所需的具体产品,并最终展示其配置信息。

    // 客户端代码
    public class Client {public static void main(String[] args) {// 创建具体建造者对象ComputerBuilder builder = new GamingComputerBuilder();// 按照流程构建电脑配置builder.buildCpu();builder.buildRam();builder.buildHardDisk();// 获取构建完成的电脑配置对象Computer gamingComputer = builder.getComputer();// 显示电脑配置信息gamingComputer.display();}
    }
    

测试结果

在这里插入图片描述

四、优缺点分析

创建者模式的优点在于:

  1. 封装性与解耦:创建者模式将复杂对象的构造过程与表示分离,客户端无需了解具体的构建细节,只需指定需要的产品类型或配置参数。这增强了系统的封装性和模块间的解耦。

  2. 产品一致性:创建者模式确保了无论何时通过建造者创建的产品,其内部结构都是一致的。即使在复杂的构建过程中,也能保持产品的完整性。

  3. 扩展性良好:当产品类增加新的属性或行为时,只需要修改相应的建造者类即可,不影响已有的代码和使用该模式的客户端代码。

  4. 便于并行构造:由于创建过程被分步实现,因此在某些情况下,可以并行执行各部分的构建工作,提高系统性能。

潜在挑战可能包括:

  1. 类数量增多:引入创建者模式后,会增加抽象建造者、具体建造者以及可选的指挥者等多个类,导致类的数量增多,一定程度上增加了系统的复杂性。

  2. 过度设计:如果产品的构建过程并不复杂或者变化较少,强制使用创建者模式可能会造成设计上的过度复杂化。

  3. 理解和调试难度:对于包含多个具体建造者的大型系统,理解各个建造者之间的关系和作用可能较为困难,特别是当建造过程涉及多层嵌套调用时,调试起来也可能较为复杂。

总结

​ 创建者模式通过将构建过程与表示分离,使得客户端只需关注构建过程本身而不必关心具体产品的内部构造细节。这不仅提高了系统的灵活性和可扩展性,也使代码更加清晰易读,降低了模块间的耦合度。然而,过度使用创建者模式可能导致类数量增多,应合理评估是否真正需要创建者模式来处理对象的创建过程。

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

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

相关文章

Apache Doris 发展历程、技术特性及云原生时代的未来规划

文章目录 每日一句正能量前言作者介绍Apache Doris 特性极简架构高效自运维高并发场景支持MPP 执行引擎明细与聚合模型的统一便捷数据接入Apache Doris 极速 1.0 时代极速列式内存布局向量化的计算框架Cache 亲和度虚函数调用SIMD 指令集 稳定多源基于云原生向量数据库Milvus 的…

基于ZYNQ的PCIE高速数据采集卡的设计(三)硬件设计

采集卡硬件设计 3.1 引言 采集卡的硬件设计是实现采集功能的基础,良好的硬件设计可以使采集功能更容 易实现,方便软件开发。本章基于第二章的硬件设计方案来详细介绍采集卡硬件设计。 包括载卡和子卡的芯片的选型、配置和具体电路的设计。载卡和子卡…

蓝桥杯《修剪灌木》

题目描述 爱丽丝要完成一项修剪灌木的工作。有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌木,让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会…

【程序员必备技能】Git入门

目录 🌈前言🌈 📁 Git的概念 📂 版本控制 📂 集中式 和 分布式 ​ 📁 创建和配置本地仓库 📁 理解工作区,暂存区,版本库 📁 Git的基本操作 📂…

JMeter实现接口自动化测试

一、JMETER的环境搭建 参考:https://www.cnblogs.com/qmfsun/p/4902534.html 二、JMETER的汉化 临时汉化方法:打开jmeter,options-->choose language-->选择语言 可以根据自己的需要选择简体中文或者繁体中文,如图&#xf…

字符串(算法竞赛)--字典树Trie与最大异或对

1、B站视频链接&#xff1a;F06 字典树(Trie)_哔哩哔哩_bilibili 题目链接&#xff1a;【模板】字典树 - 洛谷 #include <bits/stdc.h> using namespace std; const int N100010; int n; char s[N]; int ch[N][26];//ch[0][2]1表示0号节点通过c边走到了节点1 int cnt[…

【电子通识】认识FMEA(失效模式和影响分析)

FMEA是Failure Mode and Effect Analysis的英文缩写&#xff0c;中文名称为失效模式和影响分析。主要应用于航空航天、食品、汽车和核电等行业。 FMEA讨论的是事先策划以及执行措施&#xff0c;预防问题的发生或控制问题的发展&#xff0c;降低设计和过程的风险。由于问题还没…

基于java Springboot实现教务管理系统

基于java Springboot实现教务管理系统《视频版-建议收藏》 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文…

亲孙子和外孙女真的不一样吗

对老人来说&#xff0c;带孩子的性价比&#xff0c;孙子≥孙女≥外孙女&#xff1e;外孙。 没错&#xff0c;外孙是最差的选择。以上几个&#xff0c;出“白眼狼”概率最大的&#xff0c;是外孙。 因为男性天然家族意识强而血缘意识弱&#xff0c;女性则血缘意识强家族意识弱…

回归预测 | Matlab实现CPO-HKELM冠豪猪算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现CPO-HKELM冠豪猪算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现CPO-HKELM冠豪猪算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-HKELM冠豪猪算法优化混合核极限学习机…

C语言------操作符的巧妙使用

1.计算一个数字二进制补码里面1的个数 &#xff08;1&#xff09;方法一 根据这个10进制的整数&#xff0c;对这个数进行%10&#xff0c;/10不断地进行下去&#xff0c; %10得到最后一位&#xff0c;/10得到舍去最后一位之后剩余的数&#xff1b; 同理得到&#xff1a;二进…

Kubernetes(K8s)的一些重要概念以及术语简短解释

前言 温故而知新&#xff0c;不学就容易忘&#xff0c;本文将迅速介绍k8s的一些关键概念&#xff0c;供随时回顾 正文 Pod&#xff1a;Pod是Kubernetes中最小的部署单位&#xff0c;通常一个Pod内运行一个容器应用。Pod封装了容器&#xff08;可能是多个&#xff09;&#xf…

09 呼吸灯

呼吸灯简介 呼吸灯实际展示的效果就是一个 LED 灯的亮度由亮到暗&#xff0c;再由暗到亮的变化过程&#xff0c;并且该过程是循环往复的&#xff0c;像呼吸一样那么有节奏。 呼吸灯通常是采用 PWM(Pulse Width Modulation&#xff0c;即脉冲宽度调制) 的方式实现&#xff0c;在…

计算机视觉初探--LeNet原理与实践

LeNet&#xff1a;深度学习图像识别的里程碑 LeNet是卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;领域的先驱模型&#xff0c;由Yann LeCun等人在1998年提出&#xff0c;被广泛应用于手写数字识别和其他计算机视觉任务。本文将介绍LeNet模型的数学…

随想录刷题笔记 —二叉树篇11 538二叉搜索树转换为累加树 77组合

538二叉搜索树转换为累加树 递归&#xff1a;使用pronode标记仅小于该节点的节点&#xff0c;使用右中左的顺序 根据pronode值修改节点值 class Solution {TreeNode pronode null;public TreeNode convertBST(TreeNode root) {if (rootnull){return root;}if (root.right!nu…

深入了解计算机系统——1.计算机系统初步

文章目录 计算机系统信息是什么我们来看看hello在哪 程序被其他程序翻译成不同的格式处理器读取并解释内存中的指令硬件组成 计算机系统 信息是什么 信息是位上下文 下面写一段程序 ...(省略&#xff09; printf("hello world"); ... hello.c上面是一段hello程序…

Vue-Json-Schema-Form: 如何基于模板定制前端页面

本人从事的是工业物联网, 面对工业设备的通讯难题是各大设备都有各自的通讯协议, 如果想要用一款硬件去和所有设备做通讯的话, 就得面对怎么把自己想要采集的配置下发给自己的采集器的问题, 以前都是采用各种模型去尝试构建配置项, 但是因为配置可能会有深层次嵌套, 而且…

13-ATF中的Switch cpu context

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】我的联系方式-自建交流群-学习群 【必看/必看!!】ATF架构开发精讲-专题目录👈👈👈【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈目录 <

如何使用移动端设备在公网环境远程访问本地黑群晖

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

嵌入式26——进程

进程基本概念:1.进程: 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息&#xff08;根据CPU占用率排序&am…