Таким образом, вы можете сконструировать другой объект того же класса, не зная, что представляет собой объект исходного класса - это может создать действительно аккуратный компактный шаблон фабрики.
В качестве примера, это полезно, когда у вас есть объекты ресурса, которые вам нужно сконструировать, когда возникает необходимость и стоимость вычислений КАКОГО типа объекта ресурса высока (скажем, длительный запрос к БД). Поэтому фабрика увидит, был ли ему передан старый ресурсный объект, и если это так, создайте такой же, как он, просто вызвав $old_object->new()
- избегая затрат ресурсов на повторное вычисление вида ресурса.
В качестве другого примера, если у вас есть иерархия классов, обозначающая животных, и фабрика для конструирования новых животных в симуляции, вы можете вызвать $newborn = $factory->make_new_animal($mother)
с реализацией фабрики, равной просто $object->new()