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

hyperf 创建型(单例、工厂、建造者、原型)

---1. 单例模式 — 全局只有一个 ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 大白话 整个应用只创建一个实例所有地方用的都是同一个对象。 生活比喻 公司只有一个CEO不管谁找CEO找到的都是同一个人。 什么时候用 数据库连接池、Redis连接、配置类、日志类。 // Hyperf 里最简单的方式直接用容器天然单例 // config/autoload/dependencies.phpreturn[RedisClient::classRedisClient::class, // 容器默认就是单例];// 手动实现单例 class Config{private static ?Config$instancenull;private array$data[];// 构造函数私有外部不能 new privatefunction__construct(){$this-datarequireconfig.php;}public staticfunctiongetInstance(): static{if(static::$instancenull){static::$instancenew static();}returnstatic::$instance;}publicfunctionget(string$key): mixed{return$this-data[$key]?? null;}}// 用法不管调多少次都是同一个对象$config1Config::getInstance();$config2Config::getInstance();var_dump($config1$config2);// true同一个 Hyperf 协程注意点 // 协程环境下单例共享数据会有并发问题 // 用 Context 存请求级别的数据不要存在单例属性里 class UserContext{public staticfunctionset(User$user): void{Context::set(current_user,$user);// 每个协程独立}public staticfunctionget(): ?User{returnContext::get(current_user);}}---2. 工厂模式 — 专门负责造对象 大白话 你不用关心对象怎么创建的告诉工厂你要什么工厂给你造好。 生活比喻 你去餐厅点菜不用管厨房怎么做说来份宫保鸡丁端上来就行。 什么时候用 创建逻辑复杂、根据条件创建不同对象。 简单工厂 // 根据支付类型创建不同支付对象 interface PaymentInterface{publicfunctionpay(int$amount): bool;}class AlipayPayment implements PaymentInterface{publicfunctionpay(int$amount): bool{echo支付宝支付 {$amount} 元;returntrue;}}class WechatPayment implements PaymentInterface{publicfunctionpay(int$amount): bool{echo微信支付 {$amount} 元;returntrue;}}// 工厂你告诉我类型我给你造 class PaymentFactory{public staticfunctioncreate(string$type): PaymentInterface{returnmatch($type){alipaynew AlipayPayment(),wechatnew WechatPayment(), defaultthrow new\InvalidArgumentException(不支持的支付方式: {$type}),};}}// 用法不用关心怎么 new 的$paymentPaymentFactory::create(alipay);$payment-pay(100);工厂方法结合 Hyperf 容器 // 更优雅用 Hyperf 容器做工厂 class PaymentFactory{publicfunction__construct(private ContainerInterface$container){}publicfunctioncreate(string$type): PaymentInterface{$map[alipayAlipayPayment::class,wechatWechatPayment::class,];if(!isset($map[$type])){throw new\InvalidArgumentException(不支持: {$type});}return$this-container-get($map[$type]);}}// Controller 里用 class OrderController{publicfunction__construct(private PaymentFactory$factory){}publicfunctionpay(Request$request): ResponseInterface{$payment$this-factory-create($request-input(type));$payment-pay($request-input(amount));return$this-response-json([statusok]);}}---3. 建造者模式 — 一步步组装复杂对象 大白话 对象太复杂参数太多一步步设置最后 build()出来。 生活比喻 装修房子先定墙色、再定地板、再定家具最后验收交付。不是一次性全说完。 什么时候用 构造参数超过4个、对象有很多可选配置、需要链式调用。 // 场景发送消息有很多可选项 class Message{privatefunction__construct(publicreadonlystring$to, publicreadonlystring$content, publicreadonlystring$type, publicreadonly?string$title, publicreadonlyint$priority, publicreadonly?array$extra,){}public staticfunctionbuilder(string$to, string$content): MessageBuilder{returnnew MessageBuilder($to,$content);}}class MessageBuilder{private string$typetext;private ?string$titlenull;private int$priority0;private ?array$extranull;publicfunction__construct(private string$to, private string$content,){}publicfunctiontype(string$type): static{$this-type$type;return$this;// 返回自身支持链式调用}publicfunctiontitle(string$title): static{$this-title$title;return$this;}publicfunctionpriority(int$priority): static{$this-priority$priority;return$this;}publicfunctionextra(array$extra): static{$this-extra$extra;return$this;}publicfunctionbuild(): Message{returnnew Message(to:$this-to, content:$this-content, type:$this-type, title:$this-title, priority:$this-priority, extra:$this-extra,);}}// 用法链式调用清晰直观$messageMessage::builder(13800138000,您的订单已发货)-type(sms)-title(订单通知)-priority(1)-extra([order_id1001])-build();// 实际场景构建复杂查询条件 class UserQueryBuilder{private array$conditions[];private ?int$limitnull;private string$orderBycreated_at;publicfunctionactive(): static{$this-conditions[status]1;return$this;}publicfunctionvip(): static{$this-conditions[is_vip]1;return$this;}publicfunctionlimit(int$limit): static{$this-limit$limit;return$this;}publicfunctionorderBy(string$field): static{$this-orderBy$field;return$this;}publicfunctionbuild(): Builder{$queryUser::query();foreach($this-conditions as$field$value){$query-where($field,$value);}if($this-limit){$query-limit($this-limit);}return$query-orderBy($this-orderBy);}}// 用法$users(new UserQueryBuilder())-active()-vip()-limit(10)-orderBy(created_at)-build()-get();---4. 原型模式 — 复制一个现成的 大白话 创建新对象太麻烦直接克隆一个现有的再改改就行。 生活比喻 合同模板每次不从头写复制一份模板改改就发出去。 什么时候用 对象初始化成本高、需要大量相似对象、配置类对象复用。 // 场景邮件模板基础配置一样只改收件人和内容 class EmailTemplate{publicfunction__construct(public string$fromnoreplyexample.com, public string$to, public string$subject, public string$body, public array$cc[], public string$charsetUTF-8, public string$contentTypetext/html,){}// 克隆方法 publicfunctionclone(): static{returnclone$this;}// 链式修改 publicfunctionwithTo(string$to): static{$new$this-clone();$new-to$to;return$new;}publicfunctionwithSubject(string$subject): static{$new$this-clone();$new-subject$subject;return$new;}publicfunctionwithBody(string$body): static{$new$this-clone();$new-body$body;return$new;}}// 用法定义一个基础模板$baseTemplatenew EmailTemplate(from:ordermyshop.com, charset:UTF-8, contentType:text/html,);// 克隆出不同邮件不影响原模板$orderEmail$baseTemplate-withTo(userexample.com)-withSubject(您的订单已确认)-withBody(h1订单确认/h1);$shipEmail$baseTemplate-withTo(userexample.com)-withSubject(您的订单已发货)-withBody(h1订单发货/h1);// 注意clone 是浅拷贝对象属性要手动深拷贝 class Order{public array$items[];public Address$address;// 对象属性 publicfunction__clone(){// 深拷贝对象属性否则克隆体和原对象共享同一个 Address$this-addressclone$this-address;// 数组是值类型自动深拷贝不用处理}}--- 四种模式对比 ┌────────┬────────────────────┬──────────────┐ │ 模式 │ 解决什么问题 │ 一句话记忆 │ ├────────┼────────────────────┼──────────────┤ │ 单例 │ 全局只要一个实例 │ 独生子 │ ├────────┼────────────────────┼──────────────┤ │ 工厂 │ 不想关心怎么 new │ 点菜不进厨房 │ ├────────┼────────────────────┼──────────────┤ │ 建造者 │ 参数太多、分步构建 │ 装修房子 │ ├────────┼────────────────────┼──────────────┤ │ 原型 │ 复制现有对象改改用 │ 复印合同模板 │

相关文章:

hyperf 创建型(单例、工厂、建造者、原型)

---1. 单例模式 — 全局只有一个 ───────────────────────────────────────────────────────────────────…...

hyperf 可观测性方案大全

---1) 日志(结构化日志、ELK) 大白话 …...

基于安卓的机场贵宾接机服务系统毕设源码

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一种基于安卓平台的机场贵宾接机服务系统以提升机场贵宾服务效率与旅客体验质量。当前机场贵宾服务存在信息传递滞后、资源调度低效及个性化…...

如何免费实现《植物大战僵尸》完美宽屏体验?PvZWidescreen模组终极指南

如何免费实现《植物大战僵尸》完美宽屏体验?PvZWidescreen模组终极指南 【免费下载链接】PvZWidescreen Widescreen mod for Plants vs Zombies 项目地址: https://gitcode.com/gh_mirrors/pv/PvZWidescreen 厌倦了在宽屏显示器上玩经典游戏《植物大战僵尸》…...

别再死记硬背了!手把手教你用DSP28335的eCAP模块精准测量PWM频率与占空比

DSP28335实战指南:eCAP模块精准测量PWM参数的工程化实现 在电机控制、电源调试等嵌入式开发场景中,PWM信号的频率与占空比测量是工程师常遇到的基础需求。传统示波器测量法虽直观但缺乏系统集成性,而DSP28335内置的eCAP模块能以硬件级精度实现…...

GPTeam多智能体协作框架:从原理到实战部署指南

1. 项目概述:当AI学会“拉群”协作 如果你对AutoGPT这类单智能体工具已经玩得有点腻了,觉得一个AI自己跟自己玩效率有限,那么GPTeam这个项目可能会让你眼前一亮。简单来说,GPTeam是一个基于GPT-4(也支持GPT-3.5-turbo…...

低场MRI仿真框架:优化非理想磁场下的图像重建

1. 低场MRI技术背景与挑战 磁共振成像技术在过去四十年中已成为临床诊断不可或缺的工具,但传统高场强(>1T)MRI系统存在体积庞大、造价高昂(通常超过千万元)和运维成本高等问题。这直接限制了MRI在基层医疗机构和特殊场景(如急诊…...

30.use 的作用是什么?如何使用?

use 是 React 提供的一个较新的 API,用来在组件渲染过程中“读取资源”的值(常见资源包括 Promise 与 Context)。当你把一个 Promise 交给 use() 时,React 可以在 Promise 仍未完成时暂停(suspend)该组件的…...

【2026年拼多多暑期实习/春招- 4月26日-第三题- 多多玩拼图】(题目+思路+JavaC++Python解析+在线测试)

题目内容 多多手里有一套散落的拼图,这套拼图可以完整的拼出 nmn \times mnm 的矩形图片。拼图的每个碎片都有一个唯一的编号(从 11...

【2026年拼多多暑期实习/春招- 4月26日-第二题- 多多的推荐位】(题目+思路+JavaC++Python解析+在线测试)

题目内容 多多正在为首页内容安排推荐位。一共有 mmm 个推荐位,第 jjj 个推荐位的热度值为 sjs_j...

用100道题拿下你的算法面试(字符串篇-9):所有不同的(不重复)回文子串

一、面试问题给定一个由小写英文字母组成的字符串 s,找出该字符串中所有不重复的连续回文子串。示例 1:输入:字符串 s "abaaa"输出:[ "a", "aa", "aaa", "aba", "b"…...

用100道题拿下你的算法面试(字符串篇-8):回文子串数目

一、面试问题 给定一个字符串 s,求出该字符串中长度大于或等于 2 的所有回文子串的总数量。若一个子串正读与反读完全相同,则该子串为回文子串。 示例 1: 输入:s "abaab" 输出:3 解释:长度…...

手把手教你用Verilog在Xilinx Spartan-6上驱动IS62LV256 SRAM:从时序图到状态机的完整避坑指南

基于Xilinx Spartan-6的SRAM控制器实战:从时序解析到状态机优化 在FPGA开发中,片外存储器的接口设计往往是工程师面临的第一个真正挑战。IS62LV256这类SRAM芯片虽然接口相对简单,但要将数据手册中的时序参数准确转化为可综合的Verilog代码&am…...

2025届毕业生推荐的六大降AI率网站推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 需从多维度着手来降低AIGC(人工智能生成内容)可测率,首先…...

Maestro框架:用YAML简化移动端UI自动化测试

1. 项目概述:从“RunMaestro/Maestro”看移动端UI自动化测试的演进如果你是一名移动端开发者或测试工程师,最近在GitHub上搜索自动化测试方案,大概率会看到一个名为“RunMaestro/Maestro”的项目热度飙升。这不仅仅是一个新的测试框架&#x…...

CREST分子构象搜索工具完整指南:从零开始掌握高效采样技术

CREST分子构象搜索工具完整指南:从零开始掌握高效采样技术 【免费下载链接】crest CREST - A program for the automated exploration of low-energy molecular chemical space. 项目地址: https://gitcode.com/gh_mirrors/crest/crest CREST(Con…...

机器学习损失函数:原理、选择与实战技巧

1. 机器学习中的损失函数:原理与实战解析在训练机器学习模型时,损失函数就像一位严格的教练,不断告诉模型"你现在的表现离完美还有多远"。作为从业十余年的算法工程师,我见过太多项目因为损失函数选择不当而导致效果不佳…...

VS Code + MCP + Cursor + Continue:多智能体开发工作流搭建(私有化部署+离线模型接入+权限沙箱实录)

更多请点击: https://intelliparadigm.com 第一章:VS Code MCP 插件生态概览与核心价值定位 MCP 是什么? MCP(Model Context Protocol)是由 OpenAI 提出的标准化协议,用于在 IDE 中安全、可扩展地集成大…...

【2026 VS Code MCP生态白皮书】:基于127家头部科技公司实测数据的插件选型决策矩阵

更多请点击: https://intelliparadigm.com 第一章:VS Code MCP生态演进与2026技术定位 VS Code 的 MCP(Model Control Plane)生态正从实验性插件架构迈向标准化智能代理协同平台。2024年发布的 VS Code 1.90 引入了 MCP Server 协…...

Docker AI Toolkit 2026正式发布:8个生产级AI插件一键下载,附官方签名验证与离线部署脚本

更多请点击: https://intelliparadigm.com 第一章:Docker AI Toolkit 2026正式发布与核心演进 Docker AI Toolkit 2026(简称 DAIT-2026)已于 2025 年 10 月 15 日正式 GA,标志着容器化 AI 开发进入“零配置智能编排”…...

为什么你的低代码应用在MCP 2026沙箱环境总报“ContextNotBound”错误?(附官方未公开的调试模式启用密钥)

更多请点击: https://intelliparadigm.com 第一章:ContextNotBound错误的本质与MCP 2026沙箱的上下文生命周期模型 错误根源解析 ContextNotBound 是 MCP 2026 沙箱运行时的核心异常之一,表明当前执行线程试图访问一个尚未被显式绑定&#…...

面试官亲述:一道“发红包”用例设计题,我凭什么给他通过?

上周帮部门做校招面试,最近面试了不少校招同学,简历都挺能打——自动化框架、接口测试、性能压测都写着,项目经历至少两三个。我问了一个问题:“如果让你测试微信发红包,你怎么设计测试用例?”7个人里面&am…...

C++程序的五大内存分区实例详解

C程序在运行时所占用的内存区域,一般可分为栈内存区、堆内存区、全局/静态内存区、文字常量内存区及程序代码区5大分区:下面使用日常开发中的编程实例,详细介绍一下这5个分区,以便大家能更深刻的理解这5大内存分区。1、栈内存区栈…...

C++程序简单示例

前言:很多小伙伴反应想要用C刷LeetCode,但是对于C语法不熟悉,对于很多算法和数据结构也不够了解。这就导致了刷题的时候需要四处查询资料,非常的麻烦。我们先来看一段C的示例代码:1234567// my first cpp file#include…...

C++ 常用关键字使用举例

1. static控制作用域、生命周期或类成员归属123456789101112131415// 1. 全局/命名空间:仅当前文件可见(避免跨文件重定义)static int global_static 10; // 其他文件无法通过 extern 访问// 2. 局部变量:生命周期延长至程序结束…...

告别“唯大厂论”:全球财富 500 强实体企业 IT 核心岗位的隐形红利

在当前的留学生家庭中,关于计算机科学(CS)与工程类专业的就业规划,往往笼罩着一种高度趋同的“名企焦虑”。许多家长和学生将目光死死锁定在硅谷的科技巨头或少数几家头部互联网大厂上。为了挤进这些竞争白热化的窄门,…...

RAPID-LLM:大模型分布式训练性能优化实践

1. RAPID-LLM:分布式LLM训练与推理的性能优化利器在当今AI领域,大语言模型(LLM)的训练与推理已成为技术前沿的热点。随着模型参数规模从十亿级向万亿级迈进,单卡GPU已无法满足计算和内存需求,分布式训练成为…...

Python在TVA算法架构优化中的创新应用(七)

前沿技术背景介绍:AI 智能体视觉系统(TVA,Transformer-based Vision Agent),是依托Transformer架构与因式智能体所构建的新一代视觉检测技术。它区别于传统机器视觉与早期AI视觉,代表了工业智能化转型与视觉…...

Python在TVA算法架构优化中的创新应用(六)

前沿技术背景介绍:AI 智能体视觉系统(TVA,Transformer-based Vision Agent),是依托Transformer架构与因式智能体所构建的新一代视觉检测技术。它区别于传统机器视觉与早期AI视觉,代表了工业智能化转型与视觉…...

AI日志分析系统:多代理自修正RAG架构解析与实践

1. 日志分析系统的现状与挑战现代软件系统产生的日志数据正以惊人的速度增长。根据2023年DevOps状态报告,大型互联网公司每天产生的日志量普遍超过1TB,而传统金融系统的日志量也达到了数百GB级别。这些日志包含了系统运行状态、错误信息、性能指标等关键…...