Фабрика создает объекты типа ParsingHandler, у которого есть 2 зависимости - parser и formatter.
Фабрика сделана так, что parser будет одинаковым для всех созданных объектов, а formatter - разным. Т.к. parser одинаковый, мы его вообще не упоминаем в конфигах, и просто достаем его из сервис-контейнера внутри фабрики:
$parser = $container->get(Parser::class);С форматером же другая история: т.к. он будет варьироваться, то мы должны передать его через конфиг для каждого создаваемого сервиса:
ParsingHandlerAbstractFactory::KEY => [
'ParsingUpper' => [
ParsingHandlerAbstractFactory::KEY_FORMATTER => StringToUpper::class,
],
'ParsingLower' => [
ParsingHandlerAbstractFactory::KEY_FORMATTER => StringToLower::class,
],
],Отличие от первого примера в том, что тут фабрика может создавать объекты нескольких разных классов.
Мы создали ProductParser и CategoryParser, которые реализуют интерфейс ParserInterface. У них есть одна зависимость - httpClient.
Т.к. зависимость одна и та же, просто разные классы, то можно создать фабрику вроде ParserAbstractFactory, которая
- берет нужный класс из конфига,
- проверяет, что он реализует допустимый интерфейс,
- создает объект этого класса, заполняя его зависимость дефолтным значением.
Т.к. теперь у нас несколько парсеров, то в ParsingHandlerAbstractFactory можно добавить еще один ключ конфига, и сделать parser тоже настраиваемым полем.