JavaRush /Java блог /Архив info.javarush /Паттерн Singleton своими словами
Roman_kh
33 уровень
Харьков

Паттерн Singleton своими словами

Статья из группы Архив info.javarush

Привет всем, javaRush!

Расскажу сегодня про паттерн проектирования Singleton (одиночка). Паттерн Singleton своими словами - 1Цель: создать класс, у которого будет только ОДИН объект. Это значит, что сколько бы раз к нему не обращались, возвращаться будет один и тот же объект, который был создан первый раз. Это удобная вещь и необходимая во многих местах, не зря ее внедряют во фреймворки. Применение:
  • Например необходимо подключить базу данных в проект и класс, который будет отвечать за соединение с ней. Один раз создается соединение и нет нужны создавать его снова и снова
  • Application settings — класс отвечающий за настройки отружения, которые нужны для приложения: хост и порт базы данных и т.д. Они создаются один раз и используются всё время работы приложения.
  • есть еще множество примеров, о которых я не сказал, поэтому пишите в комментариях свои варианты! =)
После этого вступления, как я понимаю можно показать уже пример этого класса: (Хотя я уверен, что каждый из нас сможет придумать реализацию этого) Вот самый простой пример, когда мы ставим приватным конструктор, т.е. нельзя создавать явно объект. И есть статический метод getInstance(), который предоставляет объект.

public class Singleton {
  private static Singleton instance;
  private Singleton () {}

  public static Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
Есть проблемы с многопоточностью и тогда можно поставить метод getInstance() маркер synchronized:

public class Singleton {
  private static Singleton instance;
  private Singleton () {}

  public static synchronized Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
В конце, как обычно, хочу сказать, что если вы думаете иначе или нашли у меня ошибку — пишите в комментариях! Мы все обсудим, с удовольствием :) Если Вам понравилась статья, пишите "+" и я буду это знать. Это для меня важно :) P.S. Добавляю еще реализации: По мнению Joshua Bloch’а это лучший способ реализации шаблона Enum Singleton

public enum Singleton {
   INSTANCE;
}
Double Checked Locking & volatile

public class Singleton {
        private static volatile Singleton instance;
   
        public static Singleton getInstance() {
      Singleton localInstance = instance;
      if (localInstance == null) {
         synchronized (Singleton.class) {
            localInstance = instance;
            if (localInstance == null) {
               instance = localInstance = new Singleton();
            }
         }
      }
      return localInstance;
   }
}
И еще On Demand Holder idiom:

public class Singleton {
      
   public static class SingletonHolder {
      public static final Singleton HOLDER_INSTANCE = new Singleton();
   }
      
   public static Singleton getInstance() {
      return SingletonHolder.HOLDER_INSTANCE;
   }
}
+ Ленивая инициализация + Высокая производительность - Невозможно использовать для не статических полей класса Будут вопросы/предложения — пишите в комментарии! См. также мои другие статьи:
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Alejandro_Kolio Уровень 30
21 февраля 2017
А еще и синглтон при сериализации, тоже неплохо бы напомнить (readResolve())
Fry Уровень 41
19 января 2017
Отлично.
Автор, можно еще добавить double checked singleton, enum singleton, on demand holder idiom with nested static class.