Создание объектов: конструкторы или статические фабричные методы - PullRequest
18 голосов
/ 06 января 2011

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

Преимущества:

  1. Одним из преимуществ статических фабричных методов является то, что, в отличие от конструкторов, они имеют имена.
  2. A secondПреимущество статических фабричных методов заключается в том, что, в отличие от конструкторов, они не обязаны создавать новый объект при каждом их вызове.
  3. Третье преимущество статических фабричных методов заключается в том, что в отличие от конструкторов они могут возвращатьобъект любого подтипа их возвращаемого типа.
  4. Четвертое преимущество статических фабричных методов состоит в том, что они уменьшают многословность создания экземпляров параметризованного типа.

Недостатки:

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

Ссылка: Effective Java, Joshua Bloch, Edition 2, pg: 5-10

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

Ответы [ 3 ]

17 голосов
/ 06 января 2011
  • Преимущество 4: при использовании конструктора у вас есть

    Foo<Map<Key, Value>> foo = new Foo<Map<Key, Value>>();
    

    против

    Foo<Map<Key, Value>> foo = Foo.createFoo(); // no need to repeat
    

    это преимущество исчезнет в Java 7, когда будет введен синтаксис Diamond

  • Недостаток 2. Вы не можете легко определить, используется ли данный метод static для конструктора или для чего-то еще.

Что касается выбора - единого рецепта для этого не существует. Вы можете взвесить все вышеперечисленные преимущества и недостатки с учетом варианта использования, но чаще всего это будет просто решение, основанное на опыте.

5 голосов
/ 06 января 2011

Если вы знаете конкретный тип класса, который вы пытаетесь создать, то вызов конструктора - это нормально.

Статические фабричные методы хороши, когда вы не совсем уверены, как создать нужный объект.,

Фабричный метод все еще вызывает конструктор для конкретного типа, но метод обрабатывает решение о том, какой конкретный класс создать.Затем фабричный метод возвращает тип интерфейса (а не конкретный тип), чтобы конкретный тип был скрыт от вызывающей стороны.

0 голосов
/ 06 января 2011

Недостаток 2.

Статический метод, который используется для создания объекта, имеет такой же функциональный макет и внешний вид, что и любая другая статическая функция.

Просто взглянув на статический метод, который создает объекты, вы не узнаете, что он делает это, и наоборот - важная часть. Когда вы пишете код, с которым вы не знакомы, может быть трудно определить правильный статический метод, который используется для создания объектов.

Использование Static Factory Pattern хорошо задокументировано и может быть очень полезным, особенно в ситуациях Singleton и Multiton . Также полезно при инициализации сложных объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...