Skip to content

Instantly share code, notes, and snippets.

@sagittaracc
Last active March 13, 2021 16:40
Show Gist options
  • Save sagittaracc/a34cb6afab0e4839838021490504204a to your computer and use it in GitHub Desktop.
Save sagittaracc/a34cb6afab0e4839838021490504204a to your computer and use it in GitHub Desktop.
Паттерн проектирования "Фабрика" (пример на php). Реализация логирования в системный лог, базу данных, или файловую систему.
<?php
// Фабрика
abstract class LogFactory
{
// Фабричный метод - создает конкретные продукты фабрики
abstract public function getLog(): Log;
// Метод реализующий основное назначение продуктов фабрики (в данном случае запись в лог)
public function write($data): void
{
// Конкретный продукт ...
$log = $this->getLog();
// выполняет свое назначение в фабрике.
$log->write($data);
}
}
// Эта фабрика будет писать в системный лог
class SysLogFactory extends LogFactory
{
// Реализация фабричного метода возвращает "продукт" SysLog
public function getLog(): Log
{
return new SysLog();
}
}
// Эта фабрика будет писать в базу данных
class DbLogFactory extends LogFactory
{
// Реализация фабричного метода возвращает "продукт" DbLog
public function getLog(): Log
{
return new DbLog();
}
}
// Эта фабрика будет писать в файловую систему
class FileLogFactory extends LogFactory
{
// Реализация фабричного метода возвращает "продукт" FileLog
public function getLog(): Log
{
return new FileLog();
}
}
// Далее мы описываем продукты
// Это интерфейс "продукта"
interface Log
{
// Каждый продукт должен реализовать свой способ для чего он предназначен в фабрике (в данном случае - запись в лог)
public function write($data): void;
}
// Продукт SysLog
class SysLog implements Log
{
public function write($data): void
{
echo "Putting '$data' into the syslog";
}
}
// Продукт DbLog
class DbLog implements Log
{
public function write($data): void
{
echo "Putting '$data' into the db";
}
}
// Продукт FileLog
class FileLog implements Log
{
public function write($data): void
{
echo "Putting '$data' into the filesystem";
}
}
<?php
// В файле конфигурации указываем класс осуществляющий логирование
return [
'log' => 'FileLog',
];
<?php
// В основном файле приложения читаем конфиг
$config = require('sagittaracc.app.config.php');
// Подгружаем фабрику
require('factory-method-pattern.php');
// Создаем экземляр продукта фабрики (в данном случае - лога)
$log = new $config['log'];
// Пишем в лог событие о старте приложения
$log->write('App has been started');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment