Это полезно, потому что в Python конструктор - это просто другая функция. Например, я делал это несколько раз:
def ClassThatShouldntBeDirectlyInstantiated():
return _classThatShouldntBeDirectlyInstantiated()
class _classThatShouldntBeDirectlyInstantiated(object):
...
Конечно, это надуманный пример, но вы поняли идею. По сути, большинство людей, которые используют ваш класс, вероятно, будут думать о ClassThatShouldntBeDirectlyInstantiated как о вашем классе, и нет необходимости позволять им думать иначе. Делая так, все, что вам нужно сделать, это документировать фабричную функцию как класс, который она создает, и не вводить в заблуждение любого, кто использует класс.
В таких языках, как C # или Java, я иногда нахожу раздражающим создание таких классов, потому что может быть трудно определить, использовать ли вам конструктор или какую-либо фабричную функцию. Я не уверен, что это также относится и к Ruby.