Подтвердить что ты не робот

Создание объектов: конструкторы или статические методы Factory

Я переживаю Эффективную Java, и некоторые из моих вещей, которые я считаю стандартными, не предлагаются в книге, например, создание объекта, у меня создалось впечатление, что конструкторы - лучший способ сделать это, и книги говорят, что мы должен использовать статические методы factory, у меня мало возможностей и недостатков, поэтому я задаю этот вопрос, вот преимущества его использования.

<сильные > Преимущества:

  • Одним из преимуществ статических методов factory является то, что, в отличие от конструкторов, они имеют имена.
  • Второе преимущество статических методов factory заключается в том, что, в отличие от конструкторов, они не обязаны создавать новый объект каждый раз при вызове theyre.
  • Третье преимущество статических методов factory заключается в том, что, в отличие от конструкторов, они могут возвращать объект любого подтипа возвращаемого типа.
  • Четвертое преимущество статических методов factory заключается в том, что они уменьшают многословие создания экземпляров параметризованного типа.

Недостатки:

  • Основным недостатком предоставления только статических методов factory является то, что классы без публичных или защищенных конструкторов нельзя подклассифицировать.
  • Вторым недостатком статических методов factory является то, что они не являются легко отличить от других статических методов.

Ссылка: Эффективная Java, Джошуа Блох, издание 2, стр. 5-10

Я не могу понять четвертое преимущество и второй недостаток и был бы признателен, если кто-нибудь сможет объяснить эти моменты. Я также хотел бы понять, как решить, использовать ли для Constructor или Static factory метод для создания объектов.

4b9b3361

Ответ 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. Также полезно при инициализации сложных объектов.