1) у вас может быть распределенное приложение, в котором для разных разработчиков имеет смысл предоставлять свои собственные фабричные классы.
2) оно очень удобно при тестировании с использованием внедрения зависимостей.
3) могут существовать несколько фабричных классов, которые реализуют разные алгоритмы, но предоставляют один и тот же тип объектов данных.
Классический пример NetBeans:
JEditorPane.registerEditorKitForContentType позволяет зарегистрировать набор для каждого типа mimeпоскольку ожидалось, что несколько модулей будут пытаться зарегистрировать свои собственные наборы.