news 2026/3/10 18:38:59

零基础从零到一PHP工厂模式可视化的庖丁解牛

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
零基础从零到一PHP工厂模式可视化的庖丁解牛

工厂模式的核心价值是解耦对象创建与使用,避免new关键字散落在业务逻辑中。


一、核心原理:工厂模式解决什么问题?

▶ 1.问题场景(无工厂)
// 用户注册时发送通知if($user->type==='email'){$notifier=newEmailNotifier();// 散落在各处的 new}elseif($user->type==='sms'){$notifier=newSmsNotifier();}$notifier->send('Welcome!');
  • 痛点
    • 创建逻辑与业务逻辑耦合
    • 新增通知方式需修改多处代码
▶ 2.工厂模式解耦
// 工厂封装创建逻辑$notifier=NotifierFactory::create($user->type);$notifier->send('Welcome!');// 业务代码不再关心如何创建
  • 优势
    • 单一职责:工厂只负责创建
    • 开闭原则:新增类型只需扩展工厂,不修改调用方

💡核心认知
工厂 = 对象创建的“中央调度室”


二、可视化实现:三种工厂模式对比

▶ 1.简单工厂(Simple Factory)
  • 适用场景:产品类型较少,无需严格扩展
  • 代码实现
    // 产品接口interfaceNotifier{publicfunctionsend(string$message);}// 具体产品classEmailNotifierimplementsNotifier{publicfunctionsend(string$message){echo"📧 邮件发送:$message\n";}}classSmsNotifierimplementsNotifier{publicfunctionsend(string$message){echo"📱 短信发送:$message\n";}}// 简单工厂classNotifierFactory{publicstaticfunctioncreate(string$type):Notifier{returnmatch($type){'email'=>newEmailNotifier(),'sms'=>newSmsNotifier(),default=>thrownewInvalidArgumentException("不支持的通知类型:$type")};}}// 使用$notifier=NotifierFactory::create('email');$notifier->send('Hello');
▶ 2.工厂方法(Factory Method)
  • 适用场景:每种产品需要独立的创建逻辑
  • 代码实现
    // 抽象工厂abstractclassNotifierFactory{abstractpublicfunctioncreateNotifier():Notifier;}// 具体工厂classEmailFactoryextendsNotifierFactory{publicfunctioncreateNotifier():Notifier{returnnewEmailNotifier();}}classSmsFactoryextendsNotifierFactory{publicfunctioncreateNotifier():Notifier{returnnewSmsNotifier();}}// 使用$factory=newEmailFactory();$notifier=$factory->createNotifier();$notifier->send('Hello');
▶ 3.抽象工厂(Abstract Factory)
  • 适用场景:产品族(如 Windows/Mac UI 组件)
  • 代码实现
    // 抽象产品族interfaceButton{publicfunctionrender();}interfaceCheckbox{publicfunctionrender();}// Windows 产品族classWinButtonimplementsButton{publicfunctionrender(){echo"Windows 按钮\n";}}classWinCheckboximplementsCheckbox{publicfunctionrender(){echo"Windows 复选框\n";}}// Mac 产品族classMacButtonimplementsButton{publicfunctionrender(){echo"Mac 按钮\n";}}classMacCheckboximplementsCheckbox{publicfunctionrender(){echo"Mac 复选框\n";}}// 抽象工厂abstractclassGUIFactory{abstractpublicfunctioncreateButton():Button;abstractpublicfunctioncreateCheckbox():Checkbox;}// 具体工厂classWinFactoryextendsGUIFactory{publicfunctioncreateButton():Button{returnnewWinButton();}publicfunctioncreateCheckbox():Checkbox{returnnewWinCheckbox();}}classMacFactoryextendsGUIFactory{publicfunctioncreateButton():Button{returnnewMacButton();}publicfunctioncreateCheckbox():Checkbox{returnnewMacCheckbox();}}// 使用$factory=newMacFactory();$factory->createButton()->render();$factory->createCheckbox()->render();

三、可视化对比表

模式结构图适用场景扩展性
简单工厂调用方 → 工厂 → 产品小型项目,产品类型固定❌ 修改工厂类
工厂方法调用方 → 具体工厂 → 产品每种产品需独立创建逻辑✅ 新增具体工厂
抽象工厂调用方 → 产品族工厂 → 多产品多维度产品族(如 UI 主题)✅ 新增产品族

抽象工厂

调用方

MacFactory

MacButton

MacCheckbox

WinFactory

WinButton

WinCheckbox

工厂方法

调用方

EmailFactory

EmailNotifier

SmsFactory

SmsNotifier

简单工厂

调用方

NotifierFactory

EmailNotifier

SmsNotifier


四、工程价值与避坑指南

▶ 1.何时使用?
  • 必须用
    • 对象创建逻辑复杂(如需读取配置、依赖注入)
    • 需要统一管理生命周期(如数据库连接池)
  • 不必用
    • 简单对象(如new User()
    • 项目规模小(过度设计)
▶ 2.Laravel 中的实际应用
  • 服务容器(Service Container)
    // 绑定接口到实现app()->bind(Notifier::class,EmailNotifier::class);// 自动解析依赖$notifier=app(Notifier::class);// 相当于工厂
  • 门面(Facades)
    Mail::to($user)->send(newWelcomeMail());// 内部使用工厂模式
▶ 3.避坑指南
陷阱破局方案
工厂臃肿按业务域拆分工厂(如UserFactory,OrderFactory
忽略依赖注入工厂应接受依赖(如new NotifierFactory($config)
过度抽象优先用简单工厂,再按需升级到工厂方法

五、终极心法

**“工厂不是模式,
而是创建的契约——

  • 当你简单工厂
    你在集中创建;
  • 当你工厂方法
    你在分离责任;
  • 当你抽象工厂
    你在组合产品族。

真正的工程能力,
始于对耦合的敬畏,
成于对细节的精控。”


结语

从今天起:

  1. 小型项目用简单工厂
  2. 复杂创建逻辑用工厂方法
  3. 产品族场景用抽象工厂

因为最好的设计模式,
不是生搬硬套,
而是精准匹配业务需求。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/3 20:41:23

RealESRGAN vs GPEN画质对比:低质图像恢复效果实测

RealESRGAN vs GPEN画质对比:低质图像恢复效果实测 1. 为什么需要两种人像修复模型? 你有没有遇到过这样的情况:翻出十年前的老照片,想发朋友圈却不敢——脸糊得连自己都认不出,背景全是噪点,连眼睛都像蒙…

作者头像 李华
网站建设 2026/3/4 1:05:52

Paraformer-large中文英文混合识别效果实测:部署优化建议

Paraformer-large中文英文混合识别效果实测:部署优化建议 1. 实测前的准备:为什么选这个镜像? 你有没有遇到过这样的场景:一段30分钟的会议录音,里面夹杂着中英文术语、人名、产品名,还带着背景杂音&…

作者头像 李华
网站建设 2026/3/4 5:03:41

Qwen情感分析批量处理?批推理优化实战

Qwen情感分析批量处理?批推理优化实战 1. 为什么单模型能干两件事? 你有没有遇到过这样的场景:想给一批用户评论做情感打分,又想顺便让AI跟用户聊两句?结果发现——得装两个模型:一个BERT专门判情绪&…

作者头像 李华
网站建设 2026/3/3 21:29:56

5分钟部署Qwen-Image-Layered,AI图像分层编辑一键上手

5分钟部署Qwen-Image-Layered,AI图像分层编辑一键上手 1. 什么是Qwen-Image-Layered?一张图拆成多个“可编辑图层”的秘密 你有没有遇到过这样的问题:想把一张照片里的人物换背景,结果边缘毛糙、发丝粘连;想给商品图…

作者头像 李华
网站建设 2026/2/28 2:19:17

AI动漫创作新趋势:NewBie-image-Exp0.1支持结构化提示词实战解读

AI动漫创作新趋势:NewBie-image-Exp0.1支持结构化提示词实战解读 你有没有试过这样画一张动漫图:想让初音未来穿水手服站在樱花树下,左手拿麦克风、右手比耶,背景有飘落的花瓣和微微泛光的云层——但输入一长串英文关键词后&…

作者头像 李华
网站建设 2026/3/8 9:39:33

基于深度学习的手游评论情感分析研究

✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。 ✅成品或者定制,扫描文章底部微信二维码。 (1)手游领域词典与情感词典构建方法 手游用户评论文本具有…

作者头像 李华