PHP工厂模式Factory Pattern的实现及特点
作者:php_gl12345678 发布时间:2023-05-25 05:19:24
标签:PHP,工厂模式,Factory,Pattern
工厂模式(Factory Pattern)是什么
工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会向客户端暴露创建逻辑,而是使用一个共同的接口来指向新创建的对象。
工厂模式的优点
工厂模式可以帮助我们实现松耦合,它将客户端代码与实际创建对象的代码分离开来;
工厂模式可以帮助我们封装变化,客户端代码无需知道实际创建的对象,只需知道工厂即可;
工厂模式可以帮助我们实现单一职责原则,一个类只负责一个职责,由工厂类负责创建对象。
工厂模式的实现
在 PHP 中,我们可以使用以下方式来实现工厂模式:
1. 简单工厂模式
简单工厂模式是一种将创建逻辑封装在一个类中的工厂模式。在简单工厂模式中,我们使用一个工厂类来创建所有的对象,根据传入的参数不同来返回不同的对象实例。
<?php
// 定义接口
interface Car
{
public function run();
}
// 实现接口
class Benz implements Car
{
public function run()
{
echo 'Benz is running...';
}
}
// 实现接口
class Bmw implements Car
{
public function run()
{
echo 'Bmw is running...';
}
}
// 工厂类
class CarFactory
{
public static function createCar($type)
{
switch ($type) {
case 'Benz':
return new Benz();
case 'Bmw':
return new Bmw();
default:
throw new Exception('Undefined car type.');
}
}
}
// 使用
$car1 = CarFactory::createCar('Benz');
$car1->run(); // output: Benz is running...
$car2 = CarFactory::createCar('Bmw');
$car2->run(); // output: Bmw is running...
2. 工厂方法模式
工厂方法模式是一种将对象的创建委托给具体的工厂类来完成的工厂模式。在工厂方法模式中,我们定义一个创建对象的接口,由子类来决定实例化哪个类。
<?php
// 定义接口
interface Car
{
public function run();
}
// 实现接口
class Benz implements Car
{
public function run()
{
echo 'Benz is running...';
}
}
// 实现接口
class Bmw implements Car
{
public function run()
{
echo 'Bmw is running...';
}
}
// 定义工厂接口
interface CarFactory
{
public function createCar();
}
// 实现工厂接口
class BenzFactory implements CarFactory
{
public function createCar()
{
return new Benz();
}
}
// 实现工厂接口
class BmwFactory implements CarFactory
{
public function createCar()
{
return new Bmw();
}
}
// 使用
$benzFactory = new BenzFactory();
$car1 = $benzFactory->createCar();
$car1->run(); // output: Benz is running...
$bmwFactory = new BmwFactory();
$car2 = $bmwFactory->createCar();
$car2->run(); // output: Bmw is running...
3. 抽象工厂模式
抽象工厂模式是一种将多个对象的创建委托给具体的工厂类来完成的工厂模式。在抽象工厂模式中,我们定义一个抽象工厂接口,由具体的工厂类来实现该接口,创建多个相关的对象。
<?php
// 定义接口
interface Car
{
public function run();
}
// 实现接口
class Benz implements Car
{
public function run()
{
echo 'Benz is running...';
}
}
// 实现接口
class Bmw implements Car
{
public function run()
{
echo 'Bmw is running...';
}
}
// 定义抽象工厂接口
interface CarFactory
{
public function createBenz();
public function createBmw();
}
// 实现抽象工厂接口
class Factory implements CarFactory
{
public function createBenz()
{
return new Benz();
}
public function createBmw()
{
return new Bmw();
}
}
// 使用
$factory = new Factory();
$car1 = $factory->createBenz();
$car1->run(); // output: Benz is running...
$car2 = $factory->createBmw();
$car2->run(); // output: Bmw is running...
总结
工厂模式是一种非常常见的创建型模式,它可以帮助我们封装变化,实现松耦合,同时遵循单一职责原则。在实际开发中,我们可以根据具体的需求,选择不同的工厂模式来实现对象的创建。
来源:https://blog.csdn.net/weixin_39934453/article/details/129717050
0
投稿
猜你喜欢
- Python字典的遍历方法有好几种,其中一种是for...in,这个我就不说明,在Python了几乎随处都可见for...in。下面说的这种
- 本文实例讲述了Python实现判断给定列表是否有重复元素的方法。分享给大家供大家参考,具体如下:题目很简单,只是简单温习一个方法,most_
- 注:因为最近想用一下Python做一些简单小游戏的开发作为项目练手之用,而Pygame模块里面提供了大量的有用的方法和属性。今天我们就在之前
- 原理python没有办法直接和c++共享内存交互,需要间接调用c++打包好的库来实现流程C++共享内存打包成库python调用C++库往共享
- 本文只有代码,介绍了有关GUI界面的学生信息管理系统的实现。已经过调试没有很大问题。如有错误,还请批评指正。1.导入tkinter模块imp
- 用Python发送126邮件,供大家参考,具体内容如下今天想做个自动化邮件提醒的功能,最近刚好在学习python,都说python那么强大,
- 对象的创建模式Object 构造函数模式:先创建空对象,再动态添加属性和方法。适用场景:初始时对象内部数据不确定。存在问题:语句太多(这个问
- 1. 简介大家都知道,在数据库中间件读写分离应用场景中,如何保证底层数据库出现故障节点的时,中间件可以快速断开或迁移数据库连接,让用户无感知
- 本文实例讲述了js实现兼容性好的微软官网导航下拉菜单效果。分享给大家供大家参考。具体如下:这是一款微软官网导航菜单,兼容好的下拉菜单,微软官
- 目录JS 函数的 call、apply 及 bind 方法一、call() 方法1、call()方法的模拟实现二、apply() 方法1、a
- 本文实例讲述了php实现将数组或对象写入到文件的方法。分享给大家供大家参考,具体如下:php将数组或对象原样写入或保存到文件有三种方法可以实
- Select字句在逻辑上是SQL语句最后进行处理的最后一步,所以,以下查询会发生错误:SELECT YEAR(OrderDate) AS O
- 一、ini文件介绍INI文件格式是某些平台或软件上的配置文件的非正式标准,以节(section)和键(key)构成,常用于微软Windows
- 本文实例为大家分享了Python实现五子棋游戏的具体代码,供大家参考,具体内容如下了解游戏的规则是我们首先需要做的事情,如果不知晓规则,那么
- 今天我将教大家如何用哈希函数将密码加密加密后的密码是很难倒推的~普通加密:首先调用函数hashlibimport hashlib然后使用哈希
- 最近研究微信API,发现个非常好用的python库:wxpy。wxpy基于itchat,使用了 Web 微信的通讯协议,实现了微信登录、收发
- MySQL GUI工具很多,本文就常用的Navicat for MySQL与MySQL-Front的特色功能做一个详细介绍与比较。(一)My
- Python zipfile模块用来做zip格式编码的压缩和解压缩的,zipfile里有两个非常重要的class, 分别是ZipFile和Z
- 要做到这一点,就要尽量地使用缓存,经常地从缓存中获得以前的消息。幸运的是目前大多数WAP设备都有一定级别的缓存,在默认情况下,会尝试最大化的
- 今天遇到mysql服务1067错误的问题,设置使用系统账户也无法启动mysql,后面认证看了系统的配置信息,发现启动文件也就是mysql安装