• PHP шаблоны: Factory Method (генерация объектов)

    PHPКомментариев нет

    Проблема:

    Нам требуется реализовать хранение логов. При этом у нас возможно не одна реализация хранения, а две(вывод на экран и запись в файл). Так же возможно что со временем их станет больше.

    Решение:

    [file: Logger.php] — интерфейс для будущих классов логгирования

    <?php
    
    interface Logger
    {
        public function log(string $message);
    }

    [file: StdoutLogger.php] — класс логирования с выводом на экран сообщений

    <?php
    
    class StdoutLogger implements Logger
    {
        public function log(string $message)
        {
            echo $message;
        }
    }

    [file: FileLogger.php] — класс логирования в файл

    <?php
    
    class FileLogger implements Logger
    {
       
        public function log(string $message)
        {
            file_put_contents($this->filePath, $message, FILE_APPEND);
        }
    }

    [file: LoggerFactory.php] — интерфес для генирации классов логирования

    <?php
    
    interface LoggerFactory
    {
        public function createLogger(): Logger;
    }

    [file: StdoutLoggerFactory.php] — класс генерирующий класс логирования с выводом на экран сообщений

    <?php
    
    class StdoutLoggerFactory implements LoggerFactory
    {
        public function createLogger(): Logger
        {
            return new StdoutLogger();
        }
    }

    [file: FileLoggerFactory.php]

    <?php
    
    class FileLoggerFactory implements LoggerFactory
    {
        public function createLogger(): Logger
        {
            return new FileLogger($this->filePath);
        }
    }

    Применение

    $loggerFactory = new StdoutLoggerFactory();
    $logger = $loggerFactory->createLogger();

    Плюсы:

    Данным способом мы решаем нашу задачу генерации классов.

    Минусы:

    Данный шаблон способствует не нужному созданию подклассов а так же дублированию кода. Прежде чем использовать данный паттерн, нужно хорошенько обдумать данное решение, так как при расширении дополнительным функционалом(не только логирование) мы можем столкнуться с сильно связанной структурой.

     


    Комментарии закрыты!