Как всегда, это зависит, но, как правило, статическая фабрика, такая как ваш второй вариант, редко бывает хорошей идеей.
new
создание объекта UserCredential выглядит справедливым выбором, поскольку класс UserCredentials выглядит как отдельный, конкретный класс, который может быть полностью создан со всеми его инвариантами из имени пользователя и пароля.
В других случаях тип, который вы хотите создать, может представлять собой абстракцию. В этом случае вы не можете использовать ключевое слово new
, но вместо этого должны использовать Abstract Factory .
Использование абстрактной фабрики часто очень ценно, потому что позволяет составлять экземпляр из комбинации значений времени выполнения и других зависимостей. См. здесь для получения дополнительной информации.
Использование абстрактной фабрики также помогает в модульном тестировании , потому что вы можете просто проверить, что возвращаемое значение или конечное состояние или все, что вас волнует, связано с выходом абстрактной фабрики - для чего вы можете легко поставьте Test Double , потому что он ... абстрактный.