Фабрика позволят избавиться в коде от прямой зависимости от конкретного класса – это её основная суть. Иногда это удобно, приведу такой пример:
Есть некий класс, отвечающий за процессинг платежей PaymentManager. Вы используете фабрику, получая его и сразу передавая ему заказ:
$manager = PaymentFactory::getManager($order)
Тут ваш заказчик говорит, что теперь заказы суммой меньше 10 тыс руб должны направляться на другой платежный сервис. Можно, конечно переписать старый менеджер платежей, а можно добавить новый AlternatePaymentManager. при этом весь код, работающий с платежами остается неизменным, только в фабрике добавлям:
public static function getManager($order)
{
if($order['total'] >= 10000) {
return new PaymentManager($order);
}
else {
return new AlternatePaymentManager($order);
}
}
Такие примеры часто возникают в реальных приложениях, их можно прочувствовать заранее при написании кода. Плюс еще можно добиться выгоды и при написании тестов.