当前位置: 首页 > article >正文

建造者模式如何解决PHP对象构造参数过多问题?

在 PHP 中当一个类需要大量参数尤其是包含多个可选参数时直接使用构造函数会导致代码难以阅读、维护困难甚至出现“望远镜构造函数”Telescoping Constructor反模式。建造者模式 (Builder Pattern)通过链式调用 (Fluent Interface)和分步构建机制完美解决了这个问题。它将复杂的构造过程拆解为一个个语义清晰的步骤让对象的创建过程像写句子一样自然。一、痛点构造函数参数过多的灾难假设我们需要创建一个复杂的Email对象包含收件人、抄送、主题、正文、附件、优先级等十几个字段其中很多是可选的。❌ 方案 A望远镜构造函数 (Telescoping Constructor)为了支持不同组合你需要写一堆重载PHP 需模拟// 噩梦开始参数顺序记不住可选参数传 null 占位$emailnewEmail(toexample.com,ccexample.com,null,// bccSubject,Body,null,// attachmentnull,// prioritytrue,// isHtmlfalse// trackOpen);缺点可读性极差容易传错位置扩展新参数需修改所有调用处。❌ 方案 BSetter 注入 (JavaBean 风格)$emailnewEmail();$email-setTo(toexample.com);$email-setSubject(Subject);// ... 中间漏了某个必填项怎么办// 对象在构建完成前处于“不完整”状态可能被误用if($email-getSubject()null){/* 报错 */}$email-send();缺点代码冗长对象状态不一致风险高无法保证不可变性 (Immutability)。二、解药建造者模式的实现建造者模式引入一个独立的Builder类负责收集所有参数最后一次性生成目标对象。✅ 核心代码实现1. 定义产品类 (Product)设为不可变属性私有无 Setter只能通过 Builder 创建。classEmail{// 所有属性私有确保一旦创建不可修改privatefunction__construct(privatearray$to,privatearray$cc,privatestring$subject,privatestring$body,private?string$attachment,privatestring$priority,privatebool$isHtml,privatebool$trackOpen){}// 提供 Getter 用于访问数据publicfunctiongetTo():array{return$this-to;}publicfunctiongetSubject():string{return$this-subject;}// 关键提供一个静态方法获取 Builderpublicstaticfunctioncreate():EmailBuilder{returnnewEmailBuilder();}}2. 定义建造者类 (Builder)使用链式调用每个方法返回$this。classEmailBuilder{privatearray$to[];privatearray$cc[];privatestring$subject;privatestring$body;private?string$attachmentnull;privatestring$prioritynormal;// 默认值privatebool$isHtmltrue;// 默认值privatebool$trackOpenfalse;// 默认值// 链式方法设置参数并返回 $thispublicfunctionto(string...$emails):self{$this-to$emails;return$this;}publicfunctioncc(string...$emails):self{$this-cc$emails;return$this;}publicfunctionsubject(string$subject):self{$this-subject$subject;return$this;}publicfunctionbody(string$body):self{$this-body$body;return$this;}publicfunctionattachment(string$path):self{$this-attachment$path;return$this;}publicfunctionpriority(string$level):self{$this-priority$level;return$this;}publicfunctionisHtml(bool$flag):self{$this-isHtml$flag;return$this;}publicfunctiontrackOpen(bool$flag):self{$this-trackOpen$flag;return$this;}// 3. 最终构建验证并返回产品publicfunctionbuild():Email{// 可以在这里做最终校验if(empty($this-to)){thrownewInvalidArgumentException(Recipient to is required.);}if(empty($this-subject)){thrownewInvalidArgumentException(Subject is required.);}// 利用私有构造实例化returnnewEmail($this-to,$this-cc,$this-subject,$this-body,$this-attachment,$this-priority,$this-isHtml,$this-trackOpen);}}三、效果对比从“乱码”到“诗歌”调用方式$emailEmail::create()-to(userexample.com,adminexample.com)-cc(managerexample.com)-subject(Weekly Report)-body(h1Hello World/h1)-attachment(/tmp/report.pdf)-priority(high)-trackOpen(true)-build();优势分析维度传统构造函数建造者模式可读性低 (null,true,false满天飞)极高(方法名即文档自解释)灵活性差 (参数顺序固定可选参数难处理)极高(调用顺序任意不用的方法直接跳过)默认值处理需在构造函数定义调用者易忽略在 Builder 内部预设调用者只需关注差异对象状态构建过程中可能处于无效状态原子性只有build()成功后才产生有效对象不可变性难实现 (通常需要提供 Setter)天然支持(Product 类可完全 immutable)扩展性新增参数需修改所有调用代码新增参数只需在 Builder 加方法旧代码不受影响四、PHP 特有的优化技巧1. 利用 Variadic (可变参数)如上例中的to(string ...$emails)允许传入多个参数自动转为数组使链式调用更简洁。2. 命名参数 (PHP 8.0) 的替代方案虽然 PHP 8 引入了命名参数 (new Email(to: [...], subject: ...))在一定程度上缓解了构造函数的问题但建造者模式仍有独特优势复杂验证逻辑Builder 的build()方法可以包含复杂的交叉验证逻辑。分步构建可以在不同代码块中逐步配置对象例如在 Controller 设收件人在 Service 设内容。隐藏实现Builder 可以屏蔽 Product 类的复杂内部结构。3. 静态代理简化调用为了让调用更流畅通常在 Product 类中放一个静态入口create()或builder()避免用户直接new EmailBuilder()。五、何时使用不要滥用建造者模式。它适用于以下场景参数数量多( 4-5 个)。存在大量可选参数。参数类型相似容易混淆顺序如多个string类型参数。需要构建不可变对象。构建过程需要复杂验证。如果一个类只有 2-3 个参数直接使用构造函数或关联数组是最简单高效的。 总结建造者模式通过将“参数列表”转化为“语义化方法链”彻底消除了构造函数参数过多带来的认知负担。它让 PHP 代码从new Class(null, true, , 0, false, ...)变成了Class::create()-setEnabled(true)-setName(...)-build()这不仅是语法的糖衣更是领域特定语言 (DSL)思想的体现让代码读起来像是在描述业务需求本身。

相关文章:

建造者模式如何解决PHP对象构造参数过多问题?

在 PHP 中,当一个类需要大量参数(尤其是包含多个可选参数)时,直接使用构造函数会导致代码难以阅读、维护困难,甚至出现“望远镜构造函数”(Telescoping Constructor)反模式。 建造者模式 (Build…...

javaweb学习资料资源分享共享平台的研究和实现

目录同行可拿货,招校园代理 ,本人源头供货商功能需求分析核心技术实现特色功能设计扩展性考虑项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能需求分析 JavaWeb学习资料共享平台的…...

如何用OpenCore Legacy Patcher让老款Mac焕发新生:终极完整教程

如何用OpenCore Legacy Patcher让老款Mac焕发新生:终极完整教程 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款革…...

【100%通过率】华为OD机试真题2026双机位C卷 C++ 实现【红黑图】

目录 题目 思路 Code 题目 众所周知红黑树时一种平衡树,它最突出的特性就是不能有两个相连的红色节点。那我们定义一个红黑图,也就是一张无向图中,每个节点可能是红黑两种颜色,但我们保证没有两个相邻的红色节点。 现在给一张未染色的无向图,只能染红黑两种颜色,问总共…...

Hunyuan-OCR-WEBUI新手入门:3步搞定复杂文档文字识别

Hunyuan-OCR-WEBUI新手入门:3步搞定复杂文档文字识别 1. 引言:为什么选择Hunyuan-OCR-WEBUI? 在日常工作和学习中,我们经常会遇到需要从图片或PDF中提取文字的场景。无论是扫描的合同、手写的笔记,还是复杂的表格文档…...

OpenClaw故障排查:千问3.5-9B接口连接问题解决大全

OpenClaw故障排查:千问3.5-9B接口连接问题解决大全 1. 问题背景与排查思路 上周我在本地部署OpenClaw时,遇到了对接千问3.5-9B模型的连接问题。作为一个开源AI智能体框架,OpenClaw需要稳定接入大模型才能发挥自动化能力。但在实际配置过程中…...

基于springboot车辆管理系统设计与实现.7z(源码+论文)

[点击下载链接》》》] 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了车辆管理系统的开发全过程。通过分析车辆管理系统管理的不足,创建了一个计算机管理车辆管理系统的方案。文章介绍了车辆管理系统的…...

Qwen2.5-14B-Instruct实战部署:像素剧本圣殿8-Bit Pro版本CUDA加速实测报告

Qwen2.5-14B-Instruct实战部署:像素剧本圣殿8-Bit Pro版本CUDA加速实测报告 1. 项目概览 像素剧本圣殿(Pixel Script Temple)是一款基于Qwen2.5-14B-Instruct深度微调的专业剧本创作工具。这款工具将先进的大语言模型推理能力与独特的8-Bit…...

Phi-3-mini-128k-instruct企业级应用:基于Dify构建智能客服知识库

Phi-3-mini-128k-instruct企业级应用:基于Dify构建智能客服知识库 最近和几个做企业服务的朋友聊天,大家普遍有个头疼的问题:客服团队每天要处理大量重复的产品咨询和技术问题,人力成本高不说,新员工培训周期还特别长…...

2025_NIPS_HumanoidGen: Data Generation for Bimanual Dexterous Manipulation via LLM Reasoning

文章核心总结与翻译 一、主要内容 本文提出HumanoidGen,一款基于大语言模型(LLM)推理的自动化框架,专为类人机器人双手机动操作生成任务场景与演示数据。框架通过空间标注、LLM规划、蒙特卡洛树搜索(MCTS)增强推理等模块,解决现有数据集缺乏双手机动操作场景、数据收集…...

深求·墨鉴(DeepSeek-OCR-2)效果展示:毛笔字春联识别+吉祥话语义分析

深求墨鉴(DeepSeek-OCR-2)效果展示:毛笔字春联识别吉祥话语义分析 1. 引言:当传统书法遇见现代AI 春节临近,家家户户都在准备贴春联。那些饱含祝福的毛笔字,是中国人心中最温暖的年味。但你是否想过&…...

一些常见颜色汇总

1 1.1 CVPR2024:Koala序号示例RGBHEX1(244, 204, 204)#F4CCCC2(207, 226, 243)#CFE2F33(252, 229, 205)#FCE5CD序号示例RGBHEX1(217,217,217)#D9D9D92(252,229,205)#FCE5CD 2 2.1 AAAI2025:Stable Mean Teacher for Semi-supervised Video Action Detection序号示例…...

Qwen3-VL-8B新手入门:无需代码,用聊天界面轻松玩转AI识图

Qwen3-VL-8B新手入门:无需代码,用聊天界面轻松玩转AI识图 1. 工具简介:你的AI视觉助手 想象一下,当你看到一张复杂的图表却不知道如何解读,或者需要快速了解一张照片中的关键信息时,有一个随时待命的AI助…...

csp信奥赛c++之字符数组与字符串的区别

csp信奥赛c之字符数组与字符串的区别 一、字符数组与字符串的区别(详细讲解) 在C(尤其信奥赛CSP常用环境)中,“字符数组”和“字符串”通常指两种不同的数据类型或存储方式: 特性字符数组 (char[])字符串…...

Python3.8开发环境搭建:Miniconda镜像实测,简单高效

Python3.8开发环境搭建:Miniconda镜像实测,简单高效 1. 为什么选择Miniconda-Python3.8镜像 如果你曾经在多个Python项目间切换,一定遇到过这样的困扰:项目A需要TensorFlow 1.15,项目B需要TensorFlow 2.0&#xff0c…...

让旧款Mac重获新生:OpenCore Legacy Patcher完整指南

让旧款Mac重获新生:OpenCore Legacy Patcher完整指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否有一台被苹果官方抛弃的旧款Mac&#…...

城通网盘终极下载加速指南:三步解锁高速通道的完整教程

城通网盘终极下载加速指南:三步解锁高速通道的完整教程 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 还在为城通网盘下载速度慢如蜗牛而烦恼吗?每天都有无数用户因为城通网盘的…...

Nunchaku FLUX.1-dev 开发环境配置:Anaconda虚拟环境创建与管理指南

Nunchaku FLUX.1-dev 开发环境配置:Anaconda虚拟环境创建与管理指南 想玩转Nunchaku FLUX.1-dev这类前沿的AI模型,第一步也是最关键的一步,就是把它的“家”给搭好。这个“家”就是Python虚拟环境。你可能听过不少因为环境依赖冲突&#xff…...

科哥镜像实测:CAM++说话人识别系统快速部署与核心功能体验

科哥镜像实测:CAM说话人识别系统快速部署与核心功能体验 1. 引言:当声音成为身份密码 想象一下,你手头有一段重要的电话录音,需要确认通话双方是否是同一个人。或者,你管理着一个庞大的音频资料库,需要自…...

软件评测师基础知识专项刷题:软件测试过程

前言软考软件评测师备考之路,基础刷题必不可少。本文围绕软件测试过程模块整理经典习题 核心考点梳理,系列内容长期连载更新,慢慢积累、逐个突破,轻松夯实应试功底。考点测试过程模型1.组织级测试过程组织级测试过程用于开发和管…...

BetterNCM Installer:零门槛插件管理的颠覆式开源工具方案

BetterNCM Installer:零门槛插件管理的颠覆式开源工具方案 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 作为音乐爱好者,你是否曾因复杂的插件安装流程望而却…...

MAI-UI-8B应用场景解析:如何用AI自动分析软件界面与操作流程

MAI-UI-8B应用场景解析:如何用AI自动分析软件界面与操作流程 1. 理解MAI-UI-8B的核心能力 MAI-UI-8B是一款专为图形用户界面(GUI)分析而设计的AI模型。它能够像人类一样"看"懂软件界面,理解各种UI元素的功能,并预测用户可能的操作…...

[特殊字符]OpenClaw 优化系列(三):基于WSL的OpenClaw备份恢复与文件交互

告别环境崩塌恐惧症,一文掌握WSL下OpenClaw的数据安全与高效操作 Windows下WSL环境准备已经在前面讲了:🦞 OpenClaw 部署环境准备:Windows下WSL安装及配置全攻略。至于OpenClaw部署,教程已经很多很多了,只…...

Nano-Banana企业级部署:支持API接入PLM系统,打通产品数据链路

Nano-Banana企业级部署:支持API接入PLM系统,打通产品数据链路 1. 引言:企业级部署的价值与意义 在现代制造业和设计行业中,产品数据管理一直是个令人头疼的问题。设计师创作的产品分解图、技术团队制作的结构示意图、营销部门需…...

(87页PPT)6大领域+50个战略框架模型(附下载方式)

篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 https://download.csdn.net/download/2501_92796370/92683878 资料解读:6 大领域 50 个战略框架模型 详细资料请看本解读文章的最后内容 在商业竞争日趋激烈的当下,系统…...

NotaGen古典音乐生成:5分钟快速上手,小白也能创作贝多芬风格钢琴曲

NotaGen古典音乐生成:5分钟快速上手,小白也能创作贝多芬风格钢琴曲 1. 前言:AI音乐创作新时代 想象一下,你坐在电脑前,轻点几下鼠标,就能生成一段贝多芬风格的钢琴曲。这不是科幻电影,而是Not…...

Graphormer效果展示:实测分子属性预测,准确率超越传统GNN方法

Graphormer效果展示:实测分子属性预测,准确率超越传统GNN方法 1. 模型概述与核心优势 Graphormer是微软研究院推出的基于纯Transformer架构的图神经网络,专为分子图(原子-键结构)的全局结构建模与属性预测设计。与传…...

5个核心功能解决内容创作者的抖音批量下载痛点

5个核心功能解决内容创作者的抖音批量下载痛点 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量下载工…...

Jimeng AI Studio实现Web爬虫:数据采集自动化方案

Jimeng AI Studio实现Web爬虫:数据采集自动化方案 1. 项目背景与需求 电商公司每天需要从多个网站采集商品信息,传统的手工复制粘贴方式效率低下,而且容易出错。技术团队需要处理上百个商品页面的数据,包括价格、库存、描述和用…...

G-Helper技术架构解析:华硕笔记本ACPI控制接口的轻量化实现

G-Helper技术架构解析:华硕笔记本ACPI控制接口的轻量化实现 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Stri…...