Я читал Эффективную Java Джошуа Блоха, и до сих пор он действительно оправдывает свою репутацию. Самый первый элемент делает убедительный пример для статических factory методов над конструкторами . Настолько, что я начал подвергать сомнению справедливость старых добрых конструкторов:).
Преимущества/недостатки книги приведены ниже:
<сильные > Преимущества:
- У них есть имена!
- У нас есть общий контроль экземпляра (Singletons, производительность и т.д.).
- Они могут возвращать подтип/интерфейс
- Компилятор может предоставить вывод типа
Недостатки:
- Частные классы не могут быть подклассы
- Они не выделяются в документации как конструкторы
Первым недостатком может быть "Хорошая вещь" (как упоминается в книге). Второй, я думаю, является лишь незначительным недостатком и может быть легко разрешен с помощью предстоящих выпусков java (аннотации для javadoc и т.д.).
Похоже, что в конце factory методы имеют почти все преимущества конструкторов, гораздо больше преимуществ и никаких реальных недостатков!
Итак, мой вопрос в основном состоит из трех частей:
- Хорошо ли всегда использовать статические методы factory по умолчанию над конструкторами?
- Всегда ли оправданно использовать конструкторы?
- Почему объектно-ориентированные языки не поддерживают языковые уровни для фабрик?
Примечание. Есть два похожих вопроса: Когда использовать конструктор и когда использовать метод getInstance() (статические методы factory)? и Создание объектов: конструкторы или статические методы factory. Однако ответы либо просто содержат приведенный выше список, либо повторяют обоснование статических методов factory, о которых я уже знаю.