PHP设计模式21-工厂模式的讲解及应用

news2024/11/19 18:20:38

文章目录

  • 前言
  • 基础知识
    • 简单工厂模式
    • 工厂方法模式
    • 抽象工厂模式
  • 详解工厂模式
    • 普通的实现
    • 更加优雅的实现
  • 总结


前言

本文已收录于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快速入门与实战中,感谢大家支持。喜欢记得三联哟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV 笔记_5

文章目录 笔记_5特征点匹配DMatch 存放匹配结果DescriptorMatcher::match 特征点描述子&#xff08;一对一&#xff09;匹配DescriptorMatcher::knnMatch 特征点描述子&#xff08;一对多&#xff09;匹配DescriptorMatcher::radiusMatch 特征点描述子&#xff08;一对多&#…

Frontiers in Microbiology:DAP-seq技术在猪苓C2H2转录因子PuCRZ1调控菌丝生长及渗透胁迫耐受性机制研究中的应用

猪苓&#xff08;Polyporus umbellatus&#xff09;是一种可食用的蘑菇&#xff0c;也是我国常用的菌类药材之一&#xff0c;至今已有2000多年的药用历史&#xff0c;在《神农本草经》、《本草纲目》、《本草求真》等典籍中均有记载。猪苓具有利尿、抗菌作用&#xff0c;近年来…

SpringBatch从入门到实战(二):HelloWorld

一&#xff1a;HelloWorld 1.1 配置Job、Step、Tasklet Configuration public class HelloWorldJobConfig {Autowiredprivate JobBuilderFactory jobBuilderFactory;Autowiredprivate StepBuilderFactory stepBuilderFactory;Beanpublic Job helloWorldJob() {return jobBuild…

代码随想录算法训练营第五十九天|503.下一个更大元素II 42. 接雨水

目录 LeeCode 503.下一个更大元素II LeeCode 42. 接雨水 暴力解法 优化双指针法 单调栈法 LeeCode 503.下一个更大元素II 503. 下一个更大元素 II - 力扣&#xff08;LeetCode&#xff09; 【思路】 相较于前两道题目&#xff0c;这道题目将数组改为循环数组&#x…

python获取度娘热搜数据并保存成Excel

python获取百度热搜数据 一、获取目标、准备工作二、开始编码三、总结 一、获取目标、准备工作 1、获取目标&#xff1a; 本次获取教程目标&#xff1a;某度热搜 2、准备工作 环境python3.xrequestspandas requests跟pandas为本次教程所需的库&#xff0c;requests用于模拟h…

在读博士怎么申请公派访学?

作为在读博士生&#xff0c;申请公派访学是一项重要而有益的经历。下面知识人网将为您介绍一些关于如何申请公派访学的步骤和注意事项。 首先&#xff0c;您需要找到一个合适的公派访学机会。可以通过与导师、教授或其他相关人士进行交流来获取相关信息。还可以参考学术会议、研…

【Linux】linux | 服务响应慢、问题排查 | 带宽问题导致

一、说明 1、项目使用云服务器&#xff0c;服务器配置&#xff1a;5M带宽、4核、32G&#xff0c;1T&#xff0c;CentOS7 2、CPU、内存、磁盘IO都没有达到瓶颈&#xff0c;猜测是带宽问题 3、应用比较多&#xff0c;应用中间件&#xff0c;十几个差不多 4、同时在线人数30 5、已…

继承~~~

1&#xff1a;继承概述&#xff0c;使用继承的好处 1&#xff1a;什么是继承&#xff1f; Java中提供一个关键字extends&#xff0c;用这个关键字&#xff0c;我们可以让一个类和另一类建立起父子关系。 public class Student extends People{} Student称为子类&#xff08…

乘势而起:机载航电·显控显示系统仿真

改革开放以来&#xff0c;我国国民经济与科学技术取得了长足的发展&#xff0c;信息化、工业成熟度与自动化程度不断深化&#xff0c;极大地增强了国家的综合实力、在世界范围内显示了大国地位。在当前科技产业的发展和变革的历史性交汇期&#xff0c;“工业4.0”、“中国制造2…

iOS App 上架流程图文教学

在上架App 之前必须先准备好开发者帐号&#xff0c;但申请开发者帐号因法兰克早在之前已经申请好了&#xff0c;故就跳过此步骤&#xff0c;直接从产生凭证到上传App开始讲起。首先&#xff0c;要将自己辛苦写好的App 送审的话&#xff0c;则要依序做完下列几件事情即可。 在开…

NFT Insider #98:The Sandbox与Forkast Labs 达成合作,苹果的混合现实头显将增强游戏和元宇宙

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members(https://twitter.com/WHALEMembers)、BeepCrypto&#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周…

对称加密DES加密算法原理、用户登录应用案例分享

更多知识 学习&#xff1a;https://www.processon.com/view/60504b5ff346fb348a93b4fa#map 目录&#xff1a; DES算法的工作原理DES算法的优点DES算法的缺点DES算法的应用场景DES算法性能分析用户登录实例总结 1. DES算法的工作原理 DES算法是一种对称加密算法&#xff0c;使…

定向写作模型CTRL,Conditional Transformer Language有条件的文本生成模型

定向写作模型CTRL 介绍 CTRL全称为Conditional Transformer Language有条件的文本生成模型&#xff0c;它始于Salesforce在2019年发布的论文《A Conditional Transformer Language Model for Controllable Generation》&#xff0c;该模型用于定向写作。论文地址如下&#xff…

双功能螯合剂:1777804-45-1,DOTA-(COOt-Bu)3-CH2-Ph-azide,的反应特点及其参数说明

​ 中文名称&#xff1a;1,1-二甲基乙基4-[(4-叠氮苯基)甲基] -7,10-双[2-(1,1-二甲基乙氧基) -2-氧乙基] -1,4,7,10-四氮杂环十二烷 -1-乙酸酯 英文名称&#xff1a;DOTA-(COOt-Bu)3-CH2-Ph-azide&#xff0c;DOTA-(COOt-Bu)3-CH2-Ph-N3 规格标准&#xff1a;1g、5g、10g CAS…

【电源设计】18650电池电源串并联设计——改变电压或容量

有时我们有需要改造电池电源的需要&#xff0c;比如增大容量&#xff0c;增大电压之类的&#xff0c;本文介绍18650锂电池&#xff0c;以及如何用18650锂电池串并联设计电源&#xff0c;达到增大容量或者增大电压的效果&#xff1a; 目录 一、18650锂电池基本知识&#xff1a…

腾讯的基础认证适合没经验、没专业知识的人吗?

IT行业可以说是现在最热门的行业之一了&#xff0c;很多人都会选择报考这个专业&#xff0c;同时还有很多没有基础的人&#xff0c;也会选择在毕业后继续教育&#xff0c;从而获得进入这一行的机会&#xff0c;可以说每个人都在内卷&#xff0c;技术和证书都需要拥有&#xff0…

这就是实力!京东资深架构师用实例详解Java虚拟机(源码剖析)

前言 Java是一门流行多年的高级编程语言&#xff0c;与其相关的就业岗位很多&#xff0c;但是最近几年却出现了用人单位招不到合适的人&#xff0c;而大量Java程序员找不到工作的尴尬局面。究其根本原因是岗位对Java开发技术的要求高&#xff0c;不但要会应用&#xff0c;而且…

祛除红眼算法python实现

最近研究了一下祛除红眼的算法&#xff0c;主要的思想都是将RGB通道里面的R通道给想法设法的降低&#xff0c;其他的通道稍微进行变换就行&#xff0c;这里使用python运行了一下例子看看&#xff0c; version2参考了代码&#xff1a;https://www.cnblogs.com/cpuimage/p/90002…

华为IP-san实验搭建

文章目录 RedHat or CentOS系统1、获得多路径软件2、配置主机iscsi名3、配置存储映射4、主机访问存储的LUN5、安装多路径解决重复磁盘问题6、使用多路径扫盘 windows系统1、为win虚拟机提供多路径包文件2、创建存储与主机的连接3、主机使用磁盘 RedHat or CentOS系统 1、获得多…

为什么 kubernetes 环境要求开启 bridge-nf-call-iptables ?

文章目录 背景基于网桥的容器网络Service 同节点通信问题开启 bridge-nf-call-iptables我的环境netshoot 工具 参考 背景 Kubernetes 环境中&#xff0c;很多时候都要求节点内核参数开启 bridge-nf-call-iptables: sysctl -w net.bridge.bridge-nf-call-iptables1 参考官方文…