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

PHP简单工厂与抽象工厂对比

PHP简单工厂与抽象工厂对比

工厂模式有不同的变体。简单工厂、工厂方法、抽象工厂各有适用场景。今天说说各种工厂模式的区别和实现。

简单工厂。

```php
interface Logger
{
public function log(string $message): void;
}

class FileLogger implements Logger
{
public function log(string $message): void
{
file_put_contents('/tmp/app.log', $message . "\n", FILE_APPEND);
}
}

class EchoLogger implements Logger
{
public function log(string $message): void
{
echo "[LOG] $message\n";
}
}

class NullLogger implements Logger
{
public function log(string $message): void {}
}

// 简单工厂
class LoggerFactory
{
public static function create(string $type): Logger
{
return match ($type) {
'file' => new FileLogger(),
'echo' => new EchoLogger(),
'null' => new NullLogger(),
default => throw new InvalidArgumentException("不支持的日志类型: $type"),
};
}
}

$logger = LoggerFactory::create('echo');
$logger->log('测试');
?>

工厂方法。

```php
abstract class LoggerCreator
{
abstract public function createLogger(): Logger;

public function log(string $message): void
{
$logger = $this->createLogger();
$logger->log($message);
}
}

class FileLoggerCreator extends LoggerCreator
{
public function createLogger(): Logger
{
return new FileLogger();
}
}

class EchoLoggerCreator extends LoggerCreator
{
public function createLogger(): Logger
{
return new EchoLogger();
}
}
?>

抽象工厂。

```php
interface Button
{
public function render(): string;
}

interface Checkbox
{
public function render(): string;
}

class WindowsButton implements Button
{
public function render(): string { return "确定"; }
}

class MacButton implements Button
{
public function render(): string { return "确定"; }
}

class WindowsCheckbox implements Checkbox
{
public function render(): string { return ""; }
}

class MacCheckbox implements Checkbox
{
public function render(): string { return ""; }
}

interface UIFactory
{
public function createButton(): Button;
public function createCheckbox(): Checkbox;
}

class WindowsFactory implements UIFactory
{
public function createButton(): Button { return new WindowsButton(); }
public function createCheckbox(): Checkbox { return new WindowsCheckbox(); }
}

class MacFactory implements UIFactory
{
public function createButton(): Button { return new MacButton(); }
public function createCheckbox(): Checkbox { return new MacCheckbox(); }
}

function createUI(UIFactory $factory): void
{
echo $factory->createButton()->render() . "\n";
echo $factory->createCheckbox()->render() . "\n";
}

createUI(new WindowsFactory());
createUI(new MacFactory());
?>

工厂模式的选择依据。

// 简单工厂:创建逻辑简单,只有一个工厂类
// 工厂方法:每个产品对应一个工厂子类
// 抽象工厂:创建一系列相关产品

简单工厂适合产品种类少的场景。工厂方法让新增产品不需要修改工厂类。抽象工厂用于创建产品族。选择哪种模式取决于具体需求。

http://www.jsqmd.com/news/974053/

相关文章:

  • MATLAB版DTW孤立词识别工程:含语音预处理、MFCC特征提取与模板匹配全流程代码
  • 三月七小助手:如何让星穹铁道的日常任务自动化帮你每天节省2小时?
  • 2026大一寸证件照怎么做?尺寸规格+免费制作APP/小程序保姆教程 - 软件小管家
  • 卫星语义通信中的特征敏感排序技术解析
  • 点云数据里一键抠出平面、圆柱、长方体等常见3D形状的Python小工具
  • 从环境变量到源码:彻底搞懂QML模块导入失败的那些坑
  • 星宸SSD202D芯片全解析:从硬件选型到Linux SDK上手,东山Pi开发板为何适合入门?
  • C#版Modbus全协议通信工具包:ASCII/RTU/TCP/UDP四模一体支持
  • STM32F103R6在Proteus里跑PWM和正弦波输出的完整仿真工程包(含Keil项目+HEX固件)
  • 别再乱写注释了!手把手教你用Doxygen生成专业API文档(附常用标记速查表)
  • OpenFPGA环境搭建踩坑实录:从GTK3到TBB,手把手解决编译中的5个常见报错
  • 魔兽争霸III全面优化指南:Warcraft Helper让你的经典游戏焕发新生
  • 从银行U盾到手机APP:聊聊HOTP/TOTP那些年我们踩过的‘坑’与最佳实践
  • BMS设计避坑指南:BQ76PL455电压采集不准?STM32通信干扰?这些细节你注意了吗?
  • SpringBoot+Vue实现的应急物资管理系统源码(含论文、开题报告与数据库脚本)
  • Adobe Dimension 2024深度测评
  • 2026合肥免砸砖漏水维修全攻略|卫生间/阳台/厨房/屋顶根治方法+避坑指南|苏易修缮 - 苏易修缮
  • 临安母婴除甲醛CMA甲醛检测治理公司深度测评:绿呼吸环保稳居榜首 - 一休咨询
  • C#写的实时运动检测小工具:接摄像头或视频文件,画框标出移动物体(VS工程直接编译运行)
  • 2026沈阳市权威认证贵金属回收 TOP5+黄金回收白银回收铂金回收门店地址电话推荐
  • 特征函数:连接概率论与信号处理的‘隐藏桥梁’,一个例子讲透
  • 为什么选择appserver.io?PHP应用服务器性能提升10倍的终极指南 [特殊字符]
  • 5个步骤彻底掌握NVIDIA显卡深度调校:从隐藏参数到性能飞跃
  • 传统拉肚子就要禁食,编写程序结合腹泻程度,电解质数据,判定是否需要进食,推荐温和食材。
  • 保姆级教程:用Open3D的DBSCAN和RANSAC,5分钟搞定点云分割与聚类
  • 5分钟成为硬件大师:AMD Ryzen深度调试终极指南
  • MLOps生产落地15条硬核实践:从数据版本到自动回滚
  • 别再搞错了!你的Wi-Fi模块到底需不需要做SRRC认证?一个表格帮你理清
  • 2026年除甲醛实测:重庆本地人推荐这3家靠谱公司 - 资讯快报
  • 别再死记硬背CNN结构了!用PyTorch实战MNIST,我画了张图帮你彻底搞懂卷积和池化