есть три класса-стратегии, которые нужно вызывать в зависимости от условий. У каждого из этих классов в конструкторе инициализируются разные сервисы, которые нужны для работы конкретно этому классу.
Кроме этого у меня есть фабрика, которая в зависимости от условий возвращает одну из стратегий.
Вот тут проблема: чтобы из фабрики вернуть стратегию, мне нужно или прокинуть все стратегии в конструкторе фабрики, например так:
class Factory
{
private StrategyOne;
private StrategyTwo;
public function __construct(StrategyOne $strategyOne, private StrategyTwo)
{
$this->strategyOne = $strategyOne;
$this->strategyTwo = $strategyTwo;
}
public function create(string $condition)
{
if ($condition === 1) {
return $this->strategyOne;
} elseif ($condition === 2) {
return $this->strategyTwo;
}
}
}
Но в этом случае я как бы зря инициализирую обе стратегии, потому что использоваться будет только одна.
Второй вариант - возвращать стратегию в методе create через new, а в фабрике инициализировать все сервисы, которые нужны стратегии и передавать в конструктор.
Как это все правильно сделать?
Если вопрос только в lazy loading сервисов то можно воспользоваться Service Locator от симфы, но скорее всего можно забить болт ибо вряд ли ты что-то выиграешь этим
Не уверен, но вроде если закинуть через теги (как итератор), то сервисы будут подрубаться через lazy
во всяком случае у вас получилась не Factory, так как стратегия не создается внутри, а просто выбирается одна из уже переданых в конструторе
Обсуждают сегодня