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

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全栈系列专栏&#xff1a;PHP快速入门与实战 学会好设计模式&#xff0c;能够对我们的技术水平得到非常大的提升。同时也会让我们的代码写的非常…...

【玩转Docker小鲸鱼叭】理解Docker的核心概念

Docker核心概念 Docker有三大核心概念&#xff1a;镜像&#xff08;Image&#xff09;、容器&#xff08;Container&#xff09;、仓库&#xff08;Repository&#xff09; 1、镜像&#xff08;Image&#xff09; Docker镜像 是我们创建和运行Docker容器的基础&#xff0c;它…...

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 引擎 |官方文档 &#xff08;&#xff09; 一、确定版本&#xff08;必须是7以上版本&#xff09; cat /etc/redhat-release 二、卸载旧版本&#xff08;或者之前装过&#xff0c;没有安装过就不用管了&#xff09; &#xff08;root用…...

论信息系统项目的整体管理(范文)

论信息系统项目的整体管理&#xff08;范文&#xff09; 【摘要】 2016年10月&#xff0c;XX省卫生健康委启动了XX省分级转诊服务平台建设项目&#xff0c;我在项目中担任项目经理&#xff0c;负责项目的全面管理工作。该平台作为全省上下级医院转诊的信息化通道&#xff0c;…...

【音视频处理】音频编码AAC详解,低码率提高音质?

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们介绍音频编码格式AAC。 AAC是音频最常用的编码格式之一&#xff0c;几乎所有的播放器都支持这个编码格式。 其他音频编码格式都是类似的&#xff0c;只是某些细节存在差别&#xff0c;如压缩算法、某些音频参数存在限制…...

逆函数学习

逆函数 给定关系 R ⊆ X Y R\subseteq X\times Y R⊆XY&#xff0c;颠倒 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而言&#xff0c;其逆关系 f ~ \tilde{f} f~​可能不是 Y Y Y到…...

代码审计——SSRF详解

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 服务端请求伪造攻击&#xff08;SSRF&#xff09;也成为跨站点端口攻击&#xff0c;是由于一些应用在向第三方主机请求资源时提…...

搭建Scala开发环境

一、Windows上安装Scala 1、到Scala官网下载Scala Scala2.13.10下载网址&#xff1a;https://www.scala-lang.org/download/2.13.10.html 单击【scala-2.13.10.msi】超链接&#xff0c;将scala安装程序下载到本地 2、安装Scala 双击安装程序图标&#xff0c;进入安装向导&…...

BLIP和BLIP2

文章主要是对BLIP2 &#xff08;使用冻结图像编码器和大型语言模型的Bootstrapping语言图像预训练&#xff09;论文的阅读笔记&#xff0c;也对BLIP&#xff08;用于统一视觉语言理解和生成的Bootstrapping语言图像预训练&#xff09;算法进行了简单的介绍。 文章&#xff1a;…...

微信小程序开发实战 ⑨(TabBar)

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; 微信小程序 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f4…...

微前端探秘:初始微前端、现有方案和未来趋势

初识微前端 微前端是什么 概念&#xff1a; 微前端是指存在于浏览器中的微服务。 微前端是一种类似于微服务的架构&#xff0c;它将微服务的理念应用于浏览器端&#xff0c;即将单页面前端应用由单一的单体应用转变为把多个小型前端应用聚合为一体的应用。这就意味着前端应用…...

运维(SRE)成长之路-第2天 文本编辑工具之神VIM

vi和vim简介 在Linux中我们经常编辑修改文本文件&#xff0c;即由ASCII, Unicode 或其它编码的纯文字的文件。之前介绍过nano&#xff0c;实际工作中我们会使用更为专业&#xff0c;功能强大的工具 文本编辑种类&#xff1a; 全屏编辑器&#xff1a;nano&#xff08;字符工具…...

45从零开始学Java之详解static修饰符、静态变量和静态方法

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前一篇文章中&#xff0c;壹哥给大家讲解了abstract关键字&#xff0c;从而我们掌握了抽象类与抽象…...

电商超卖,从业务到设计

编辑导语&#xff1a;超卖这一概念的定义可以从不同层面进行阐述&#xff0c;比如平台层面、渠道层面、仓库层面等。而假设因超卖导致订单难以履行&#xff0c;则容易让用户体验“打折”。为什么有时电商超卖的现象会发生&#xff1f;可以从哪些角度来降低超卖导致的风险&#…...

【MySQL】表的约束

表的约束 表的约束1. 空属性2. 默认值3. 列描述4. zerofill&#xff08;自动补零&#xff09;5. 主键—primary key5.1 复合主键 6. 自增长—auto_increment7.唯一键 --- unique8. 外键 --- foreign key…reference9. 综合案例 表的约束 真正约束字段的是数据类型&#xff0c;…...

【计算机网络】第一章 概述(下)

文章目录 第一章 概述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、项目背景 化工园区化工厂是生产安全重点单位&#xff0c;对人员定位管理需求强烈。对人员定位主要需求是&#xff1a;一般区域人数统计、人员轨迹、重点区域人员实时精准定位。 华安联大安全化工园区人员全过程轨迹化安全解决方案通过人员实时定位管理、移动轨迹追溯、险情…...

Java泛型中的T、E、K、V、?通配符,你确定都了解吗?

目录 前言 泛型带来的好处 泛型中通配符 小结 前言 Java 泛型&#xff08;generics&#xff09;是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制&#xff0c;该机制允许开发者在编译时检测到非法的类型。 泛型的本质是参数化类型&#xff0c;也就是说所操…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...