当前位置: 首页 > 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.gsyq.cn/news/1485777.html

相关文章:

  • STM32F103R6在Proteus里跑PWM和正弦波输出的完整仿真工程包(含Keil项目+HEX固件)
  • 卫星语义通信中的特征敏感排序技术解析
  • 从环境变量到源码:彻底搞懂QML模块导入失败的那些坑
  • 别再乱写注释了!手把手教你用Doxygen生成专业API文档(附常用标记速查表)
  • 从银行U盾到手机APP:聊聊HOTP/TOTP那些年我们踩过的‘坑’与最佳实践
  • OpenFPGA环境搭建踩坑实录:从GTK3到TBB,手把手解决编译中的5个常见报错
  • 2026年除甲醛实测:重庆本地人推荐这3家靠谱公司 - 资讯快报
  • 别再死记硬背CNN结构了!用PyTorch实战MNIST,我画了张图帮你彻底搞懂卷积和池化
  • 基于C++实现(控制台)学生程序管理系统
  • MuleSoft企业级LLM编排:AI Orchestration实战指南
  • 155.纯代码自动化刷机工具|适配安卓全机型+苹果设备,支持SN/MAC校准写入
  • AI动态简报之技术前沿篇(2026.06.08)
  • 入行网安多年薪资不见涨?先看全等级薪资参考,再学高效逆袭策略
  • 从台湾到泰州:4000平米厂房背后的坚守,钰腾如何用笨功夫死磕品质?
  • 承重沙发脚生产厂商选哪家好 - 品牌推广大师
  • WinForms窗体缩放时控件自动等比适配的轻量封装类(含可运行示例)
  • 避坑指南:Logisim运算器(Arithmetic)级联时,那些容易搞错的进位/借位连接
  • 广州增城祖传老黄金回收攻略|无钢印、无票据变现估价避坑指南 - 行行星
  • Tadi 实验室:Splash 颜色格式助力颜色挑选,简单实现与多样应用
  • 如何用FlauBERT_small_cased快速实现法语文本特征提取?完整教程
  • 3分钟快速上手:免费音乐歌词批量下载器完整指南
  • 别再乱抛RuntimeException了!手把手教你设计一个实用的Java业务异常类(附完整代码)
  • Win10下用PHPStudy快速搭建PHP5.6.40环境,告别手动配置Apache的烦恼
  • 如何让老款Mac焕发新生:OpenCore Legacy Patcher完整使用指南
  • 解密三星固件加密机制:samloader背后的技术细节
  • 2026厂房暖通改造优选设计施工一体服务,缩短工期节约预算 - 品牌2026
  • MyBatis批量插入踩坑实录:从‘20分钟’优化到‘6秒’,我都经历了什么?
  • CANN矩阵乘与AllReduce融合算子
  • Maya glTF插件完整指南:3步将专业3D模型转换为Web标准格式
  • 即插即用AI记忆系统:零侵入兼容任意大模型