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