Использование синглтона Java

В частности, в Java, как используются синглтоны? Похоже, что все, что можно сделать с помощью синглтона, можно сделать и с помощью статических методов и переменных. Есть ли что-то, что мне не хватает. Многие пользователи предлагают отложенную загрузку в качестве причины, однако похоже, что в Java это не является преимуществом.

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

Обновить/изменить:

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

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

Есть ли еще какие-то преимущества?


person Teddy    schedule 22.06.2014    source источник
comment
"The only benefit I can think of is that the implementation could be enhanced though a overridden implementation in a new class, which is substituted in the getInstance() method." Это было бы ошибочной реализацией шаблона Singleton в Java, потому что вы могли бы свободно создавать более одного объекта предполагаемого синглтона, создавая подкласс и разрешая создание его экземпляров средствами, отличными от метода getInstance.   -  person toniedzwiedz    schedule 22.06.2014
comment
Я не хотел обойти синглтон, используя подклассы. Я имел в виду только один экземпляр подкласса через сам getInstance.. например, через видимый пакетом класс.   -  person Teddy    schedule 22.06.2014
comment
Возможный дубликат: stackoverflow.com/ вопросы/519520/   -  person kajacx    schedule 22.06.2014
comment
@kajacx Хотя многие пункты применимы, этот вопрос не зависит от языка. Я хочу быть более ясным в отношении влияния Java. Некоторые языки, по-видимому, допускают переопределение статического метода, а в некоторых языках отложенная загрузка является преимуществом одноэлементного метода. Кроме того, влияние сборки мусора не имеет значения в Java.   -  person Teddy    schedule 22.06.2014


Ответы (3)


Цель синглтона – управлять созданием объектов, ограничивая количество объектов только одним. Поскольку существует только один экземпляр Singleton, любые поля экземпляра Singleton будут встречаться только один раз для каждого класса, как и статические поля. Одиночки часто контролируют доступ к ресурсам, таким как соединения с базой данных или сокеты.

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

Шаблон проектирования Singleton решает все эти проблемы. С помощью шаблона проектирования Singleton вы можете:

  • Убедитесь, что создан только один экземпляр класса
  • Обеспечить глобальную точку доступа к объекту
  • Разрешить несколько экземпляров в будущем, не затрагивая клиентов одноэлементного класса.

для получения дополнительной информации прочитайте это, а также см.

Разница между шаблоном Singleton и статическим классом на Java

person rachana    schedule 22.06.2014
comment
В статье, на которую вы ссылаетесь, это единственное упомянутое преимущество Singleton (которое выглядит близко к тому, о чем я думал, с большей ясностью): Основное преимущество Singleton над static заключается в том, что первый более объектно-ориентирован, чем позже. С Singleton вы можете использовать наследование и полиморфизм для расширения базового класса, реализации интерфейса и предоставления различных реализаций. - person Teddy; 22.06.2014

страница википедии в шаблоне указывает на несколько распространенных применений:

Объекты Facade часто являются одноэлементными, поскольку требуется только один объект Facade.

Объекты состояния часто являются одиночками (т. е. глобальным состоянием).

Одиночкам часто отдают предпочтение перед глобальными переменными, потому что:

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

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

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

person Matthew Franglen    schedule 22.06.2014
comment
Я понимаю частое использование объектов с одним экземпляром. Просто во многих случаях та же функциональность может быть достигнута с помощью только статических методов. Причина выбора между статическим классом и синглтоном более утонченная. Например, почему фасад не может быть реализован с использованием статических методов.. - person Teddy; 22.06.2014
comment
Вы можете захотеть протестировать классы, использующие фасад, и в этом случае использование объекта значительно упрощает задачу, поскольку вы можете заменить фиктивный объект. Это особенно просто, если синглтон реализует интерфейс. - person Matthew Franglen; 22.06.2014

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

Я согласен с этим.

Есть ли еще какие-то преимущества?

Используя его как объект . Например, вы не можете передать статический класс как объект в параметре.

person davidxxx    schedule 16.07.2016