Как использовать «Статические методы фабрики» вместо конструкторов?

Эффективная Java говорит: «Рассмотрите возможность предоставления статических заводских методов вместо конструкторов»

Если у тебя есть

class A { public static A getInstance() { return new A(); } } 

Имеет ли смысл предоставлять этот метод для classа A, а не называть новый код A () в коде.

См. Здесь, чтобы получить хорошее изложение основных причин, по которым вы, возможно, захотите это сделать. В итоге:

  1. Именованные «конструкторы».
  2. При необходимости может вернуть значение null.
  3. Может возвращать экземпляр производного classа, если это необходимо.
  4. Уменьшите многословие при создании экземпляров переменных общих типов.

Другая причина приходит в голову, что статья не упоминает: может реализовать интересную логику, чтобы не создавать новые объекты все время (кеширование на основе параметров, переработка и т. Д.).

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

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

 class Complex { public static Complex fromCartesian(double real, double imag) { return new Complex(real, imag); } public static Complex fromPolar(double modulus, double angle) { return new Complex(modulus * cos(angle), modulus * sin(angle)); } private Complex(double a, double b) { //... } } Complex c = Complex.fromPolar(1, pi) 

Или другим примером может служить шаблон Singleton . Там вы не будете предоставлять только один экземпляр. Вот почему вы делаете конструктор закрытым и создаете собственный метод getInstance, где вы убедитесь, что всегда доступен только один экземпляр.

 public class Singleton { private volatile static Singleton singleton; private Singleton() { } // synchronized keyword has been removed from here public static Singleton getSingleton() { if(singleton==null) { synchronized(Singleton.class){ if(singleton == null) { singleton = new Singleton(); } } } return singleton; } } 

Заводской шаблон метода Википедия

Шаблон Singleton со статическими вызовами методов является лучшим дизайном, если ур ищет один экземпляр .. из-за реентерабельности блокировки статики. Обеспечение безопасности streamов, а также избежание записи из-за порядка.

  • цвет андроида между двумя цветами, в зависимости от процента?
  • Загрузка ресурса из любого места в пути classpath
  • Удалить class = атрибут
  • Выполнение другой java-программы из нашей java-программы
  • Лучший способ отформатировать двойное значение до 2 десятичных разрядов
  • Использование Java для вывода данных с веб-страницы?
  • Клиент Android REST, образец?
  • ЗАПРОС, ОПРЕДЕЛЕННЫЙ с помощью API-интерфейса Google Адресов для веб-сервера, используемого в приложении для Android
  • Что является самым элегантным способом конвертировать дефисное слово (например, «делать что-то») в более низкое изменение верблюжьего случая (например, «doSomeStuff»)?
  • Java: вызов метода внешнего classа в анонимном внутреннем classе
  • Почему Collections.shuffle () терпит неудачу для моего массива?
  • Interesting Posts

    Как синхронизировать контакты Thunderbird с контактами Gmail

    Windows 8 отображает разделы linux ext4 как RAW

    Как обмениваться Ethernet-соединением на Ubuntu (Jaunty)?

    Android Mask bitmap на canvasе gen черное пространство

    Ошибка Entity Framework MySQL. Указанный поставщик хранилища не может быть найден в конфигурации или недействителен

    Как слить 2 вектора чередующихся индексов?

    Прикрепите окно формы к другому окну в C #

    Верно ли, что NS64 () не должен использовать производственный код?

    Как устранить ошибку «Имя локального устройства уже используется»?

    Первый код – сначала модель / firebase database

    Гость VirtualBox для Windows 10 – изменение размера, моментальные снимки и активация потери

    Использует ли setWidth (int pixels) dip или px?

    Можно ли декомпилировать файл .apk для Android?

    java.net.SocketException: программное обеспечение вызвало прерывание соединения: recv failed

    Как изменить каталог монтирования образа диска по умолчанию на osx

    Давайте будем гением компьютера.