Как управлять создаваемым типом объекта в методе другого класса?

Например, у нас есть класс Maker
Class MyClass
{
 
 public function __construct(SomeClass $obj, AnotherClass $obj2)
 {
   // инициализация с переданными параметрами
 }
 private function doSomething()
  {
     $event = new ConcreteEvent();
    // И дальше что то делаем
  }

}


Вопрос именно в методе doSomething. В нем я создаю объект класса concreteEvent и дальше какой нибудь код. Но что, если мне надо создавать объект класса OtherEvent в методе doSomething() класса MyClass.

Передавать в конструктор фабрику? Но тогда сигнатура конструктора раздуется. А если таких методов будет 10?

Отнаследовать класс MyClass, для того, чтобы переписать только один метод. А если нужны вариации с другими такими же методами?

Важно отметить, что подобные методы либо приватные либо защищенные. То если извне нельзя передавать им параметры.
Как логичнее поступить?
  • Вопрос задан
  • 247 просмотров
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
Паттерн Стратегия

Делаем общий для объектов Event интерфейс (с головы придумал метод begin() ):
interface EventInterface
{
        public function begin();
}


и создаем разные events:
class ConcreteEvent implements EventInterface
{
        public function begin()
        {
                // ..
        }
}
class OtherEvent implements EventInterface
{
        public function begin()
        {
                // ..
        }
}


В нашем MyClass создаем свойство $event и для него сеттер и используем его:
Class MyClass
{
        private $event;

        public function __construct(SomeClass $obj, AnotherClass $obj2)
        {
                // инициализация с переданными параметрами
        }
        
        public function setEvent(EventInterface $event)
        {
                $this->event = $event;
        }

        private function doSomething()
        {
                // Работаем с нашим event
                $someDoing = $this->event->begin();
        }
}


Тогда уже в конечном коде нам нужно будет работать так примерно:
$myObj = new MyClass(SomeClass $obj, AnotherClass $obj2);

// Set Event
$myObj->setEvent(new OtherEvent);

// Далее работаем с наши готовым объектом, у которого уже есть нужны Event


ЗАРАНЕЕ ПРИНОШУ ПРОЩЕНИЯ, ЕСЛИ ОШИБСЯ — сам как 3 дня изучаю паттерны
Возможно вам не подойдет применение далее по реализации — нужно смотреть что и как

Почему-то думал, что такой вопрос возымеет популярность
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы