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());
?>
工厂模式的选择依据。
// 简单工厂:创建逻辑简单,只有一个工厂类
// 工厂方法:每个产品对应一个工厂子类
// 抽象工厂:创建一系列相关产品
简单工厂适合产品种类少的场景。工厂方法让新增产品不需要修改工厂类。抽象工厂用于创建产品族。选择哪种模式取决于具体需求。
