Проблема:
Нам требуется реализовать хранение логов. При этом у нас возможно не одна реализация хранения, а две(вывод на экран и запись в файл). Так же возможно что со временем их станет больше.
Решение:
[file: Logger.php] — интерфейс для будущих классов логгирования
1 2 3 4 5 6 |
<?php interface Logger { public function log(string $message); } |
[file: StdoutLogger.php] — класс логирования с выводом на экран сообщений
1 2 3 4 5 6 7 8 9 |
<?php class StdoutLogger implements Logger { public function log(string $message) { echo $message; } } |
[file: FileLogger.php] — класс логирования в файл
1 2 3 4 5 6 7 8 9 10 |
<?php class FileLogger implements Logger { public function log(string $message) { file_put_contents($this->filePath, $message, FILE_APPEND); } } |
[file: LoggerFactory.php] — интерфес для генирации классов логирования
1 2 3 4 5 6 |
<?php interface LoggerFactory { public function createLogger(): Logger; } |
[file: StdoutLoggerFactory.php] — класс генерирующий класс логирования с выводом на экран сообщений
1 2 3 4 5 6 7 8 9 |
<?php class StdoutLoggerFactory implements LoggerFactory { public function createLogger(): Logger { return new StdoutLogger(); } } |
[file: FileLoggerFactory.php]
1 2 3 4 5 6 7 8 9 |
<?php class FileLoggerFactory implements LoggerFactory { public function createLogger(): Logger { return new FileLogger($this->filePath); } } |
Применение
1 2 |
$loggerFactory = new StdoutLoggerFactory(); $logger = $loggerFactory->createLogger(); |
Плюсы:
Данным способом мы решаем нашу задачу генерации классов.
Минусы:
Данный шаблон способствует не нужному созданию подклассов а так же дублированию кода. Прежде чем использовать данный паттерн, нужно хорошенько обдумать данное решение, так как при расширении дополнительным функционалом(не только логирование) мы можем столкнуться с сильно связанной структурой.
Комментарии закрыты!