Я тоже это видел, особенно в довольно старых примерах.
Идея состоит в том, что все начинается с одного статического вызова, и пользователь ничего не создает в куче. Вместо этого «платформа приложения» каким-то образом создает то, что ей нужно, и пользователь только указывает, какие конкретные реализации использовать. Таким образом, пользователь указывает используемый класс, но на самом деле ничего еще не создано. Одним из рисков этого является то, что вы можете передать класс, экземпляры которого не конвертируются в AppFrame. Это может привести к исключению.
Я лично считаю этот уродливый дизайн. Это имеет смысл в языках, где более распространено непосредственное создание экземпляра класса через объект класса, такой как Smalltalk или Python. Я думаю, что в Java придерживаться заводских интерфейсов еще сложнее, но все же лучше.