PHP设计模式21-工厂模式的讲解及应用
文章目录
- 前言
- 基础知识
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
- 详解工厂模式
- 普通的实现
- 更加优雅的实现
- 总结
前言
本文已收录于PHP全栈系列专栏:PHP快速入门与实战
学会好设计模式,能够对我们的技术水平得到非常大的提升。同时也会让我们的代码写的非常优雅,避免出错,也能更好的扩展和维护我们的项目。

基础知识
简单工厂模式
简单工厂模式(Simple Factory Pattern):简单工厂模式是指由一个工厂类根据传入的参数决定创建哪一种产品类的实例。这一模式虽然简单,但它违背了开放封闭原则,因为每添加一个新产品就需要修改工厂类逻辑代码。
工厂方法模式
工厂方法模式(Factory Method Pattern):工厂方法模式是指将具体产品的创建延迟到具体的工厂子类中进行,由抽象工厂定义产品对象的创建接口,而具体工厂负责产生具体的产品。
抽象工厂模式
抽象工厂模式(Abstract Factory Pattern):抽象工厂模式是指针对一系列相关或相互依赖的产品组成的一个产品族,提供一个统一的接口来创建这些产品。抽象工厂模式可以用于创建一组具有同样约束的产品,同样,这一模式也存在着开放封闭原则问题,新增产品可能导致所有相关工厂类的修改。
详解工厂模式
普通的实现
工厂模式是一种创建型设计模式,它提供了一个通用接口来创建对象,但是允许子类决定实例化哪个类。 它仅仅是通过Factory类的某些方法来实例化对象,而不是通过new关键字。
在PHP中,我们可以使用工厂模式来创建各种对象。例如,我们可以使用工厂模式来创建数据库连接对象,或者创建各种工具类的实例。
下面是工厂模式的例子,演示如何在PHP中使用工厂模式:
interface Car {public function getModel();
}class BMW implements Car{public function getModel() {return "BMW";}
}class Audi implements Car{public function getModel() {return "Audi";}
}class CarFactory {public static function createCar($type) {switch ($type) {case "BMW":return new BMW();case "Audi":return new Audi();default:throw new Exception("Invalid car type specified.");}}
}$car1 = CarFactory::createCar("BMW");
echo $car1->getModel(); // BMW$car2 = CarFactory::createCar("Audi");
echo $car2->getModel(); // Audi
在上面的代码中,我们定义了两个汽车类,BMW和Audi。我们还定义了一个CarFactory类,该类根据传递给它的参数返回所需的汽车类的实例。 我们可以使用这个工厂类轻松创建不同类型的汽车对象。 在这个例子中,我们使用工厂模式创建了一个BMW实例和一个Audi实例。
更加优雅的实现
但是上面的代码用到了Switch显然不太优雅,我们可以借助PHP中的反射更好的实现工厂模式。反射可以为我们提供在运行时动态加载类的机制,这意味着我们可以使用反射来自动获取类名并实例化对象,而不需要在工厂类中显式指定要创建的类的名称。请看下面的代码。
。
<?php
// 创建一个工厂类
class CarFactory {public static function createCar($carType) {$className = ucfirst($carType).'Car'; // 构建类名if(class_exists($className)) { // 如果类存在$reflectionClass = new ReflectionClass($className); // 创建反射类return $reflectionClass->newInstance(); // 返回实例化后的对象}throw new Exception('Invalid car type.'); // 如果类不存在则抛出异常}
}// 定义两个车型的类
class BenzCar {}
class BMWCar {}// 调用工厂方法创建对象
$benz = CarFactory::createCar('benz');
$bmw = CarFactory::createCar('bmw');
上述代码中,我们使用ReflectionClass类来反射获取类,然后使用newInstance方法实例化对象。这样,当有新的车型类被添加到系统中时,我们无需修改工厂类的代码,仍然可以使用相同的方法进行实例化。
总结
以上就是关于本篇文章介绍的内容,工厂模式的讲解及应用,后续更多内容将收录在专栏PHP快速入门与实战中,感谢大家支持。喜欢记得三联哟。
相关文章:
PHP设计模式21-工厂模式的讲解及应用
文章目录 前言基础知识简单工厂模式工厂方法模式抽象工厂模式 详解工厂模式普通的实现更加优雅的实现 总结 前言 本文已收录于PHP全栈系列专栏:PHP快速入门与实战 学会好设计模式,能够对我们的技术水平得到非常大的提升。同时也会让我们的代码写的非常…...
【玩转Docker小鲸鱼叭】理解Docker的核心概念
Docker核心概念 Docker有三大核心概念:镜像(Image)、容器(Container)、仓库(Repository) 1、镜像(Image) Docker镜像 是我们创建和运行Docker容器的基础,它…...
Eureka 心跳和服务续约源码探秘——图解、源码级解析
🍊 Java学习:社区快速通道 🍊 深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想 🍊 绝对不一样的职场干货:大厂最佳实践经验指南 📆 最近更新:2023年5月25日 🍊 点赞 👍 收藏 ⭐留言 📝 都是我最大的动力! 文章目录 分布式系统的心跳机制心跳机制的实…...
代码随想录二刷 530 二叉搜索树的最小绝对差 98. 验证二叉搜索树 700. 二叉搜索树中的搜索
530 二叉搜索树的最小绝对差 代码如下 func getMinimumDifference(root *TreeNode) int { var pre *TreeNode res : math.MaxInt var traverse func(root * TreeNode) traverse func(root * TreeNode) { if root nil { return } traverse(root.Left) …...
Docker安装——CentOS7.6(详细版)
ps:docker官网 在 CentOS 上安装 Docker 引擎 |官方文档 () 一、确定版本(必须是7以上版本) cat /etc/redhat-release 二、卸载旧版本(或者之前装过,没有安装过就不用管了) (root用…...
论信息系统项目的整体管理(范文)
论信息系统项目的整体管理(范文) 【摘要】 2016年10月,XX省卫生健康委启动了XX省分级转诊服务平台建设项目,我在项目中担任项目经理,负责项目的全面管理工作。该平台作为全省上下级医院转诊的信息化通道,…...
【音视频处理】音频编码AAC详解,低码率提高音质?
大家好,欢迎来到停止重构的频道。 本期我们介绍音频编码格式AAC。 AAC是音频最常用的编码格式之一,几乎所有的播放器都支持这个编码格式。 其他音频编码格式都是类似的,只是某些细节存在差别,如压缩算法、某些音频参数存在限制…...
逆函数学习
逆函数 给定关系 R ⊆ X Y R\subseteq X\times Y R⊆XY,颠倒 R R R的所有有序偶可以得到 R R R的逆关系 R ~ ⊆ Y X \tilde{R}\subseteq Y\times X R~⊆YX 但是对于函数 f : X → Y f:X\to Y f:X→Y而言,其逆关系 f ~ \tilde{f} f~可能不是 Y Y Y到…...
代码审计——SSRF详解
为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 服务端请求伪造攻击(SSRF)也成为跨站点端口攻击,是由于一些应用在向第三方主机请求资源时提…...
搭建Scala开发环境
一、Windows上安装Scala 1、到Scala官网下载Scala Scala2.13.10下载网址:https://www.scala-lang.org/download/2.13.10.html 单击【scala-2.13.10.msi】超链接,将scala安装程序下载到本地 2、安装Scala 双击安装程序图标,进入安装向导&…...
BLIP和BLIP2
文章主要是对BLIP2 (使用冻结图像编码器和大型语言模型的Bootstrapping语言图像预训练)论文的阅读笔记,也对BLIP(用于统一视觉语言理解和生成的Bootstrapping语言图像预训练)算法进行了简单的介绍。 文章:…...
微信小程序开发实战 ⑨(TabBar)
作者 : SYFStrive 博客首页 : HomePage 📜: 微信小程序 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 Ǵ…...
微前端探秘:初始微前端、现有方案和未来趋势
初识微前端 微前端是什么 概念: 微前端是指存在于浏览器中的微服务。 微前端是一种类似于微服务的架构,它将微服务的理念应用于浏览器端,即将单页面前端应用由单一的单体应用转变为把多个小型前端应用聚合为一体的应用。这就意味着前端应用…...
运维(SRE)成长之路-第2天 文本编辑工具之神VIM
vi和vim简介 在Linux中我们经常编辑修改文本文件,即由ASCII, Unicode 或其它编码的纯文字的文件。之前介绍过nano,实际工作中我们会使用更为专业,功能强大的工具 文本编辑种类: 全屏编辑器:nano(字符工具…...
45从零开始学Java之详解static修饰符、静态变量和静态方法
作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前一篇文章中,壹哥给大家讲解了abstract关键字,从而我们掌握了抽象类与抽象…...
电商超卖,从业务到设计
编辑导语:超卖这一概念的定义可以从不同层面进行阐述,比如平台层面、渠道层面、仓库层面等。而假设因超卖导致订单难以履行,则容易让用户体验“打折”。为什么有时电商超卖的现象会发生?可以从哪些角度来降低超卖导致的风险&#…...
【MySQL】表的约束
表的约束 表的约束1. 空属性2. 默认值3. 列描述4. zerofill(自动补零)5. 主键—primary key5.1 复合主键 6. 自增长—auto_increment7.唯一键 --- unique8. 外键 --- foreign key…reference9. 综合案例 表的约束 真正约束字段的是数据类型,…...
【计算机网络】第一章 概述(下)
文章目录 第一章 概述1.5 计算机网络的性能指标1.5.1 速率1.5.2 带宽1.5.3 吞吐量1.5.4 时延 1.6 计算机网络体系结构1.6.1 常见的体系结构1.6.2 分层的必要性1.6.4 体系结构中的专用术语 1.8 习题 第一章 概述 1.5 计算机网络的性能指标 常用的 计算机网络 的性能指标有以下 …...
化工园区人员全过程轨迹化安全解决方案
1、项目背景 化工园区化工厂是生产安全重点单位,对人员定位管理需求强烈。对人员定位主要需求是:一般区域人数统计、人员轨迹、重点区域人员实时精准定位。 华安联大安全化工园区人员全过程轨迹化安全解决方案通过人员实时定位管理、移动轨迹追溯、险情…...
Java泛型中的T、E、K、V、?通配符,你确定都了解吗?
目录 前言 泛型带来的好处 泛型中通配符 小结 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操…...
RePKG完整指南:Wallpaper Engine资源提取与格式转换工具全解析
RePKG完整指南:Wallpaper Engine资源提取与格式转换工具全解析 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 一、功能解析:掌握RePKG核心能力 1.核心功能…...
信息发布平台毕设实战:从零构建高可用内容分发系统
背景痛点:为什么你的毕设平台总感觉“差点意思”? 很多同学在做“信息发布平台”这类毕业设计时,往往只关注功能实现,忽略了背后的架构和性能问题。结果就是,一个看似功能齐全的平台,一旦面临稍微复杂的场景…...
淘宝任务自动化:让每天25分钟的重复操作变成5分钟的智能管理
淘宝任务自动化:让每天25分钟的重复操作变成5分钟的智能管理 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi …...
Go网络编程nethttp包解析
Go语言凭借其简洁高效的特性,已成为现代网络编程的热门选择。其中,标准库中的net/http包为开发者提供了强大的HTTP服务端和客户端功能,极大简化了Web开发流程。本文将深入解析net/http包的核心特性,帮助开发者掌握构建高性能Web服…...
RTX4090D优化版Qwen3-32B+OpenClaw:3小时搞定AI办公自动化
RTX4090D优化版Qwen3-32BOpenClaw:3小时搞定AI办公自动化 1. 为什么选择本地部署方案 去年冬天,当我第17次被飞书机器人返回的"API配额不足"提示打断工作流时,终于下定决心寻找替代方案。作为一个小型技术团队的负责人࿰…...
解决插件管理痛点:Scarab的智能高效管理方案
解决插件管理痛点:Scarab的智能高效管理方案 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 你是否曾为部署一个心仪的游戏插件而耗费整个下午?好不容易…...
告别插件冲突!手把手教你手动安装Obsidian动态目录插件(Dynamic Table of Contents)
告别插件冲突!Obsidian动态目录插件手动安装全指南 为什么需要手动安装动态目录插件? Obsidian作为一款强大的知识管理工具,其插件生态让用户能够高度自定义工作流。然而,插件间的兼容性问题常常成为用户痛点。许多用户习惯使用Fl…...
MogFace人脸检测惊艳效果:CVPR22模型在极端光照(强逆光/频闪光)下的人脸召回提升实测
MogFace人脸检测惊艳效果:CVPR22模型在极端光照(强逆光/频闪光)下的人脸召回提升实测 你有没有遇到过这样的场景?在逆光下拍的照片,人脸黑成一团,或者是在闪烁的灯光下,人脸忽明忽暗࿰…...
Llama-3.2V-11B-cot跨平台部署:从VMware虚拟机到物理服务器
Llama-3.2V-11B-cot跨平台部署:从VMware虚拟机到物理服务器 最近在帮几个团队部署Llama-3.2V-11B-cot这个多模态大模型,发现一个挺有意思的现象:大家的基础设施环境差别太大了。有的团队用的是VMware虚拟化集群,资源灵活但总觉得…...
从Python调包侠到量化研究员:我的3年转型踩坑实录与学习路线图
从Python调包侠到量化研究员:我的3年转型踩坑实录与学习路线图 三年前,我还是一名只会用Python调包的数据工程师,每天的工作就是清洗数据、跑模型、生成报表。直到某次聚会上,一位在私募基金做量化的朋友随口提了句"我们组去…...
