Last active
March 13, 2021 16:40
-
-
Save sagittaracc/a34cb6afab0e4839838021490504204a to your computer and use it in GitHub Desktop.
Паттерн проектирования "Фабрика" (пример на php). Реализация логирования в системный лог, базу данных, или файловую систему.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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"; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// В файле конфигурации указываем класс осуществляющий логирование | |
return [ | |
'log' => 'FileLog', | |
]; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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