PHP怎么实现工厂模式_Factory模式编写指南【指南】

用静态方法封装对象创建逻辑,返回统一接口类型,避免散落的new、解耦调用方与具体类,适用于构造依赖外部配置或需统一初始化的场景。PHP里怎么写一个能用的工厂类直接给结论:用静态方法封装对象创建逻辑,别让调用方关心具体类名和构造细节。核心不是"设计模式"这个词,而是解决「new 太多、类型分散、改起来牵一发而动全身」的问题。常见错误现象:new User()、new Admin()、new Guest() 在控制器里到处出现;加个新角色就得翻遍所有 new 地方;单元测试时没法轻松替换成 Mock 对象。工厂类本身不继承任何东西,也不实现接口------它只是个纯工具类返回类型统一用接口或抽象类(比如 UserInterface),而不是具体类名避免在工厂里做复杂业务判断,比如「根据 IP 地址决定返回哪个用户」------那是策略模式的事,工厂只管"造出来",不管"为什么造"如果参数差异大(比如有的要传 id,有的要传 token),优先拆成多个静态方法,比如 createFromId() 和 createFromToken(),别硬塞进一个 create()什么时候该用工厂,而不是 new 或 DI 容器不是所有对象创建都适合工厂。关键看「创建逻辑是否稳定」和「调用方是否需要解耦」。使用场景:立即学习"PHP免费学习笔记(深入)";对象构造依赖外部配置(比如不同环境用不同缓存驱动,但代码里不能写死 new RedisCache())类名可能变化(比如从 JsonLogger 换成 SentryLogger,但日志接口不变)需要统一初始化行为(比如每个 Connection 实例都必须调用 connect())别用工厂的情况:对象很简单,没依赖、没配置、没状态(比如 new DateTime())项目已用 DI 容器(如 Laravel 的 app()->make() 或 Symfony 的 container-\>get()),再写一层工厂纯属重复劳动工厂方法里开始做 if-else 类型路由(比如 if (type === 'mysql') { return new MysqlAdapter(); })------这其实是简单工厂的退化,该上抽象工厂或策略了静态工厂 vs 抽象工厂:PHP 里怎么选PHP 没有接口方法的重载,也没办法像 Java 那样靠泛型约束类型,所以「抽象工厂」在 PHP 里容易写得笨重又难测。大多数时候,静态工厂够用,且更直觉。 Fotor AI Image Generator Fotor 平台的 AI 图片生成器

相关推荐
jiayou641 小时前
KingbaseES 表级与列级加密完全指南
数据库·后端
花酒锄作田16 小时前
Pydantic校验配置文件
python
hboot16 小时前
AI工程师第四课 - 深度学习入门
pytorch·python·神经网络
GBASE21 小时前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
ZhengEnCi1 天前
P2M-Matplotlib折线图完全指南-从数据可视化到趋势分析的Python绘图利器
python·matlab·数据可视化
ZhengEnCi1 天前
P2L-Matplotlib饼图完全指南-从数据可视化到图表定制的Python绘图利器
python·matlab
曲幽1 天前
你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南
python·fastapi·web·graphql·route·cors·rest·strawberry
用户8358086187911 天前
基于 Self-RAG 与列表级重排序的进阶 RAG 系统设计与实现
python
xiezhr1 天前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
Warson_L2 天前
Python `Annotated` 与 LangGraph Reducer 学习笔记
python