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

news/2024/10/23 6:31:07/

文章目录

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


前言

本文已收录于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.ppmy.cn/news/421315.html

相关文章

虚拟机全屏太小,如何放大

干货&#xff01;&#xff01;&#xff01; 点击虚拟机右上角的电源图表、&#xff0c;找到螺丝刀扳手图标、搜索Display更改分辨率、确认更改问题解决&#xff01;&#xff01;&#xff01;

有效减小虚拟机占的内存

我这个电脑内存少&#xff0c;D盘才350g,结果kali占了300g,主要的原因还是我的快照拍了比较多&#xff0c;平常拍快照可以避免我们操作失误导致系统崩溃&#xff0c;就算崩溃了还可以还原&#xff0c;这样确实挺好&#xff0c;但快照很占内存&#xff0c;如果是分散的快照还行&…

玩游戏计算机虚拟内存怎么设置,玩游戏时提示虚拟内存太小怎么办

小编这里要跟大家分享的是关于玩游戏时提示虚拟内存太小的解决方法&#xff0c;游戏是如今很多人在业余时间用来消遣和放松的方式&#xff0c;电脑运行顺畅是玩游戏必备的条件之一&#xff0c;否则就会很扫兴&#xff0c;但是一些用户反映&#xff0c;好不容易想要玩一把游戏的…

服务器虚拟内存最佳设置范围,虚拟内存有什么用?虚拟内存设置多少合适?

在硬盘上划分一块区域用于保存内存中暂时不用的数据&#xff0c;这块区域称为虚拟内存。相对于硬盘空间来说&#xff0c;内存容量往往小得多&#xff0c;尤其是2005 年以前(128MB、256MB)&#xff0c;现在内存容量增加不少&#xff0c;最小的都有4GB&#xff0c;大的有64GB、12…

最终幻想15计算机内存不足,虚拟内存不足

虚拟内存不足 08/12/2011 本文内容 当 Visual Studio 崩溃并且虚拟内存不足时&#xff0c;会显示此消息。 但是&#xff0c;这并不意味着系统中的虚拟内存不足&#xff0c;而是 Visual Studio 将用尽地址空间。 此错误通常出现在具有 32 位操作系统的计算机上&#xff0c;这些操…

什么是虚拟内存?虚拟内存的原理

虚拟内存 最近看Binder原理的时候&#xff0c;讲到一个概念MMap&#xff0c;Memory Map&#xff0c;内存映射&#xff0c;一言蔽之就是物理内存和虚拟内存的映射&#xff08;这个不是重点&#xff09;。然而突然产生个疑问——什么是虚拟内存&#xff1f;我大概是傻了&#xf…

认识---虚拟内存

内存 物理内存 真正的内存 真实插在板子的内存多大 虚拟内存 为满足内存容量不足需求 -> 在外存(硬盘)开辟空间 一个程序想要运行&#xff0c;必须运行在真实的物理内存之上。 所以必须在虚拟内存地址和物理内存地址之间建立一种映射关系。 虚拟内存的意义&#xff1a…

虚拟内存?

虚拟内存&#xff1f; 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存&#xff08;一个连续完整的地址空间&#xff09;&#xff0c;而实际上&#xff0c;它通常是被分隔成多个物理内存碎片&#xff0c;还有部分暂时存储在外部磁盘存储器…