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

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

Проблема:

Генерация связанных наборов классов которые реализуют единый интерфейс. На примере реализуем парсер разных форматов.

Решение:

[file: Parser.php] — интерфейс для парсера

interface Parser
{
    public function parse(string $input): array;
}

[file: CsvParser.php] — класс парсер csv файлов

class CsvParser implements Parser
{
    public function parse(string $input): array
    {
       // парсим csv файл
    }
}

[file: JsonParser.php] — класс парсер json

class JsonParser implements Parser
{
    public function parse(string $input): array
    {
        return json_decode($input, true);
    }
}

[file: ParserFactory.php] — фабрика для генерации классов реализации парсера

class ParserFactory
{
    public function createCsvParser(bool $csv): CsvParser
    {
        return new CsvParser($csv);
    }

    public function createJsonParser($json): JsonParser
    {
        return new JsonParser($json);
    }
}

Применение

$factory = new ParserFactory();
$parser = $factory->createCsvParser();
$result = $parser->parse($csv_file);

Плюсы:

Мы отделили систему от деталей реализации, можем создавать новые форматы для парсера, не меняя текущий код(только добавлять в фабрику).

Так же мы сгруппировали функционально связанные элементы.

Минусы:

Мы привязываемся к фабрике которая которая имеет сильную функциональную связанность, тем самым мы немного теряем в расширяемости, если нам понадобится добавить дополнительный функционал к парсерам а не новый парсер.


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