Паттерн Singleton

Паттерн объектно-ориентированного программирования – Singleton.

В этой статье я хочу затронуть тему одного из наиболее распространенных паттернов объектно-ориентированного программирования – Singleton. Но в данном случае я не буду описывать преимущества/недостатки и области применения этого паттерна, а попытаюсь изложить свой взгляд на его имплементацию в JAVA.

Область применения
1.) В системе должно существовать не более одного экземпляра заданного класса.
2.) Экземпляр должен быть легко доступен для всех клиентов данного класса. 
3.) Создание объекта on demand, то есть, когда он понадобится первый раз, а не во время инициализации системы.

Когда же использовать статический класс вместо синглтона


Действительно, есть некоторые ситуации, когда использование статического класса имеет больший смысл, чем использование синглтона. Лучшим примером этого является java.lang.Math, который не является синглтоном, взамен класса со всеми статическими методами. Вот несколько ситуаций когда, я думаю, осмысленней использовать статический класс вместо синглтона:

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

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

Разница между синглтоном и статическими классами.


Это ответ на наш второй вопрос с интервью о сравнении синглтона со статическими классами. Как я ранее сказал, основная разница между ними состоит в том, что один из них представляет собой объект, в то время как другой представляет собой метод. Вот еще несколько различий в Java между статическими классами и синглтоном:

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

2) Еще одно различие между синглтоном и статическими классами состоит в возможности переопределения. Статические методы в Java не могут быть переопределены, это приводит к потере гибкости. С другой стороны, вы можете переопределить 09.06.13
методы определенные в синглтон-классе, путем расширения этого класса.

3) Статические классы тяжело копировать и следовательно, тяжело тестировать, в отличии от синглтона, который прелестно легко копируется и также легко тестируется. Легче написать тест JUnit для Синглтона, чем для статических классов, потому что вы можете передавать макет объекта синглтона всякий раз, когда это ожидается, например в конструкторе или как аргументы методов.

4) Если по Вашим требованиям необходимо поддержать состояние, то в таком случае синглтон является лучшим выбором, чем статический класс, потому что поддержание состояния в последнем случае — кошмар, и ведет к неочевидным ошибкам.

5) Синглтон классы могут медленно загружаться, если они являются тяжелыми объектами. В то же время статические классы не имеют многих преимуществ синглтона, зато всегда загружаются немедленно.

6) Многие фреймворки с внедрением зависимостей, например Spring, достаточно хорошо управляют синглтонами, что делает их использование очень легким.

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

Преимущества синглтона над статическим классом.

Главное преимущество синглтона над статическими классами является то, что первый является более объектно-ориентированным, чем последний. С синглтоном можно использовать наследование и полиморфизм для расширения основных классов, реализовать интерфейс и возможно обеспечить разные реализации. Если мы говорим про java.lang.Runtime, который является в Java синглтоном, вызов метода getRuntime() вернет разные реализации, основанные на разных JVM, но гарантируют только один экземпляр в одной JVM, имеющей статический класс java.lang.Runtime, то при этом невозможно вернуть разные реализации для разных JVM.

Всё это — различия в Java между синглтоном и статическим классом. Если вам нужен класс с полной объектно-ориентированной совместимостью, выберите синглтон, а если вам нужно просто хранить кучу статических методов вместе, тогда используйте статические классы.

Реализация (JAVA):

На данный момент существуют несколько вариантов реализации со своими недостатками и преимуществами. В них мы и попробуем сейчас разобраться. 

  1.  public class Singleton1 {

  2.  private static Singleton1 singleton; 
  3.  
  4.  private Singleton1() {} 

  5.  public static Singleton1 getInstance() { 
  6.  if (singleton == null) {
  7.      singleton = new Singleton1();
  8.  } 
  9.  return singleton;
  10.  }

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

comments powered by Disqus

Интересное

Стив Джобс о Mac OS X:
«Я убежден в том, что половина того что отделяет успешных предпринимателей от неудачников — это настойчивость.».
Марк Эллиот Цукерберг:
«Люди всегда немного скептически относятся к чему-то быстрорастущему, но им нужно просто взглянуть на то, что делается.».
Марк Эллиот Цукерберг:
"Множество конфиденциальных вещей намного проще держать в централизованной системе."
Стив Джобс о операционной системе Google Android:
Мы не лезем в поиск, но они решили заняться телефонами. Не надо заблуждаться, они хотят уничтожить iPhone. Мы им не позволим.
Стив Джобс о Mac OS X:
«Мы сделали значки на экране такими красивыми, что вам захочется их лизнуть».


Курсы валют

bank-ua.com bank-ua.com bank-ua.com

Стоит взглянуть