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();

Плюсы:

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

Минусы:

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

 


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