Одна ситуация, в которой я лично нахожу отдельные классы Фабрики, чтобы иметь смысл, - это когда последний объект, который вы пытаетесь создать, зависит от нескольких других объектов. Например, в PHP: предположим, у вас есть объект House
, который, в свою очередь, имеет объект Kitchen
и LivingRoom
, а объект LivingRoom
также содержит объект TV
.
Самый простой метод для достижения этой цели состоит в том, чтобы каждый объект создавал своих дочерних элементов в своем методе конструирования, но если свойства являются относительно вложенными, когда ваше House
не удается создать, вы, вероятно, потратите некоторое время, пытаясь изолировать именно то, что не удалось.
Альтернативой является выполнение следующего (внедрение зависимости, если вам нравится необычный термин):
$TVObj = new TV($param1, $param2, $param3);
$LivingroomObj = new LivingRoom($TVObj, $param1, $param2);
$KitchenroomObj = new Kitchen($param1, $param2);
$HouseObj = new House($LivingroomObj, $KitchenroomObj);
Здесь, если процесс создания House
терпит неудачу, есть только одно место для поиска, но необходимость использовать этот блок каждый раз, когда требуется новый House
, далеко не удобна. Введите фабрики:
class HouseFactory {
public function create() {
$TVObj = new TV($param1, $param2, $param3);
$LivingroomObj = new LivingRoom($TVObj, $param1, $param2);
$KitchenroomObj = new Kitchen($param1, $param2);
$HouseObj = new House($LivingroomObj, $KitchenroomObj);
return $HouseObj;
}
}
$houseFactory = new HouseFactory();
$HouseObj = $houseFactory->create();
Благодаря фабрике здесь процесс создания House
абстрагируется (в том, что вам не нужно создавать и настраивать каждую отдельную зависимость, когда вы просто хотите создать House
), и в то же время централизованный, что облегчает обслуживание. Существуют и другие причины, по которым использование отдельных фабрик может быть полезным (например, тестируемость), но я нахожу этот конкретный пример использования, чтобы лучше всего показать, как классы Фабрики могут быть полезны.