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

    xEpozZ
    @xEpozZ
    Веб-разработчик
    > Теперь объекты, которые создает фабрика имеют подтипы. Требуется разный алгоритм выбора действия в зависимости от подтипа созданного фабрикой объекта

    Значит фабрика у вас не должна ничего решать сама. Разные типы + разные действия = разные классы, фабрики.

    1. Может проще создать парочку отдельные фабрик для этих подклассов и в нужном месте вызывать нужную, не ожидая, что какая-то стратегия правильно сматчит вам фабрику?
    2. Если у вас еще одна фабрика появилась, то это не значит, что здесь супер узкое бутылочное горлышко и его нужно рефакторить. Тем более, если пока сами не знаете как лучше это сделать. Сделайте пару развилок через if. Когда появится больше запросов к этому коду, тогда и новое поведение подскажет, как всё-таки он должен выглядеть.
    3. Если всё-таки хотите как-то отрефакторить сейчас, то вариант от vilinyh подойдет на первое время. А возможно и на всегда.
    $object = Factory::create($id);
    $action = ActionFactory::create($status, $object);
    $action->run();

    Только для ясности я бы его переписал так:
    $factory = Factory::create($id);
    $result = $factory->run($status);

    Немного пояснений:
    Factory::create() – отдаст вам фабрику по объекту. Там сделаете пару if на проверку типа.
    $factory->run() – выполнит нужные действия уже в фабрике нужного класса.

    4. А еще можно сделать методы не статическими, обернуть интерфейсам, инжектить через контейнер, сделать промежуточный AggregateFactory, который будет делать if $subFactory->supports() цикле по всем фабрикам, которые реализуют уже логику, умно отлавливать ошибки, логировать результаты и всё в этом духе. Почти стратегию и реализовали таким способом. Но вот только нужно оно вам сейчас? :)
    Ответ написан
    2 комментария