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

    Плюсы:

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

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

    Минусы:

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


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