Как управлять создаваемым типом объекта в методе другого класса? Например, у нас есть класс 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
196 +1
1
Ответы
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 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир