Как управлять создаваемым типом объекта в методе другого класса? Например, у нас есть класс MakerClass MyClass
{

public function __construct(SomeClass $obj, AnotherClass $obj2)
{
// инициализация с переданными параметрами
}
private function doSomething()
{
$event = new ConcreteEvent();
// И дальше что то делаем
}
}
Вопрос именно в методе doSomething. В нем я создаю объект класса concreteEvent и дальше какой нибудь код. Но что, если мне надо создавать объект класса OtherEvent в методе doSomething() класса MyClass.
Передавать в конструктор фабрику? Но тогда сигнатура конструктора раздуется. А если таких методов будет 10?
Отнаследовать класс MyClass, для того, чтобы переписать только один метод. А если нужны вариации с другими такими же методами?
Важно отметить, что подобные методы либо приватные либо защищенные. То если извне нельзя передавать им параметры.
Как логичнее поступить?

21 Авг 2019 в 07:00
171 +1
0
Ответы
1

Один из способов управления создаваемым типом объекта в методе другого класса - использовать фабричный метод. Вы можете создать абстрактный класс, который будет иметь метод для создания объекта определенного типа, а затем унаследовать этот класс и реализовать метод создания объекта в подклассе. Таким образом, вы сможете легко изменять тип создаваемого объекта, не изменяя интерфейс конструктора или других методов класса.

Пример:

abstract class EventFactory {
public abstract function createEvent();
}
class ConcreteEventFactory extends EventFactory {
public function createEvent() {
return new ConcreteEvent();
}
}
class OtherEventFactory extends EventFactory {
public function createEvent() {
return new OtherEvent();
}
}
class MyClass {
private $eventFactory;
public function __construct(SomeClass $obj, AnotherClass $obj2, EventFactory $eventFactory)
{
$this->eventFactory = $eventFactory;
// инициализация с переданными параметрами
}
private function doSomething()
{
$event = $this->eventFactory->createEvent();
// И дальше что-то делаем
}
}

Таким образом, вы можете легко изменять тип создаваемого объекта, просто передавая разные фабрики в конструктор класса MyClass. Кроме того, при необходимости вы можете создать различные фабрики для различных методов, не изменяя сам код метода doSomething.

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 683 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир