Создание объектов: конструкторы или статические методы Factory
Я переживаю Эффективную Java, и некоторые из моих вещей, которые я считаю стандартными, не предлагаются в книге, например, создание объекта, у меня создалось впечатление, что конструкторы - лучший способ сделать это, и книги говорят, что мы должен использовать статические методы factory, у меня мало возможностей и недостатков, поэтому я задаю этот вопрос, вот преимущества его использования.
<сильные > Преимущества:
- Одним из преимуществ статических методов factory является то, что, в отличие от конструкторов, они имеют имена.
- Второе преимущество статических методов factory заключается в том, что, в отличие от конструкторов, они не обязаны создавать новый объект каждый раз при вызове theyre.
- Третье преимущество статических методов factory заключается в том, что, в отличие от конструкторов, они могут возвращать объект любого подтипа возвращаемого типа.
- Четвертое преимущество статических методов factory заключается в том, что они уменьшают многословие создания экземпляров параметризованного типа.
Недостатки:
- Основным недостатком предоставления только статических методов factory является то, что классы без публичных или защищенных конструкторов нельзя подклассифицировать.
- Вторым недостатком статических методов factory является то, что они не являются легко отличить от других статических методов.
Ссылка: Эффективная Java, Джошуа Блох, издание 2, стр. 5-10
Я не могу понять четвертое преимущество и второй недостаток и был бы признателен, если кто-нибудь сможет объяснить эти моменты. Я также хотел бы понять, как решить, использовать ли для Constructor или Static factory метод для создания объектов.
Ответы
Ответ 1
-
Преимущество 4: при использовании конструктора у вас есть
Foo<Map<Key, Value>> foo = new Foo<Map<Key, Value>>();
против
Foo<Map<Key, Value>> foo = Foo.createFoo(); // no need to repeat
это преимущество исчезнет на Java 7, когда будет представлен синтаксис алмаза
-
Недостаток 2. Вы не можете легко определить, используется ли данный метод static
для конструктора или для чего-то еще.
Как выбрать - для этого нет единого рецепта. Вы можете взвесить все вышеперечисленные преимущества и недостатки с учетом прецедента, но чаще всего это будет просто решение, основанное на опыте.
Ответ 2
Если вам известен конкретный тип класса, который вы пытаетесь создать, то вызов конструктора в порядке.
Статические Factory Способы хороши, когда вы не совсем уверены, как построить требуемый объект.
Метод Factory по-прежнему вызывает конструктор по конкретному типу, но метод обрабатывает решение о том, какой конкретный класс необходимо создать. Затем метод Factory возвращает тип интерфейса (а не конкретный тип), так что конкретный тип скрыт от вызывающего.
Ответ 3
Недостаток 2.
Статический метод, который используется для создания объекта, имеет тот же функциональный макет и внешний вид, что и любая другая статическая функция.
Просто взглянув на статический метод, который создает объекты, которые вы не знаете, он делает это, а противоположность - соответствующая часть. Когда вы пишете код, который вам незнакомы, может быть сложно определить правильный статический метод, который используется для создания объектов.
Использование Static Factory Pattern хорошо документировано и может быть очень полезно, особенно в Singleton и Multiton. Также полезно при инициализации сложных объектов.