• Как выбирать действие в зависимости от типа объекта?

    @vVega Автор вопроса
    Можете привести сигнатуру $subFactory->supports()?
  • Как выбирать действие в зависимости от типа объекта?

    @vVega Автор вопроса
    Да, вы правы, что приведенный код является маршрутизатором (в этом контексте скорее resolver). Однако вопрос был в том, как выбрать разный алгоритм выбора действия в зависимости от подтипа созданного фабрикой объекта. Решил таким образом. Не уверен, что "стратегия" здесь подходит.

    class Resolver
    {
        private Foo $foo;
    
        public function __construct(Foo $foo)
        {
            $this->foo = $foo;
        }
    
        public function resolve(string $status): void
        {
            if ($this->getResolvingStrategy()->needsCreate($status)) {
                $this->foo->create();
            } elseif ($this->getResolvingStrategy()->needsCancel($status)) {
                $this->foo->cancel();
            } elseif ($this->getResolvingStrategy()->needsCommit($status)) {
                $this->foo->commit();
            }
        }
    
        private function getResolvingStrategy(): ResolvingStrategy
        {
            if ($this->foo instanceof Bar) {
                return new BarResolvingStrategy();
            }
    
            if ($this->foo instanceof Baz) {
                return new BazResolvingStrategy();
            }
    
            throw new Exception();
        }
    }
    
    class BarResolvingStrategy implements ResolvingStrategy
    {
        public function needsCreate(string $status): bool
        {
            return $status === 'A';
        }
    
        public function needsCancel(string $status): bool
        {
            return $status === 'B';
        }
    
        public function needsCommit(string $status): bool
        {
            return $status === 'C';
        }
    }
    
    class BazResolvingStrategy implements ResolvingStrategy
    {
        public function needsCreate(string $status): bool
        {
            return $status === 'D';
        }
    
        public function needsCancel(string $status): bool
        {
            return $status === 'E';
        }
    
        public function needsCommit(string $status): bool
        {
            return $status === 'F';
        }
    }
    
    interface ResolvingStrategy
    {
        public function needsCreate(string $status): bool;
        public function needsCancel(string $status): bool;
        public function needsCommit(string $status): bool;
    }
  • Как выбирать действие в зависимости от типа объекта?

    @vVega Автор вопроса
    vilinyh, не понял мысль. Вы по сути просто изменили сигнатуру текущей реализации.
  • Как выбирать действие в зависимости от типа объекта?

    @vVega Автор вопроса
    Дмитрий, нужен вариант рефакторинга. Думаю, что статика точно не подходит. Возможно паттерн стратегия подойдёт...