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

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

Расскажу сегодня про паттерн проектирования Singleton(одиночка).

Цель:
Создать класс, у которого будет только ОДИН объект.

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

Это удобная вещь и необходимая во многих местах, не зря ее внедряют во фреймворки.

Применение
  • Например необходимо подключить базу данных в проект и класс, который будет отвечать за соединение с ней. Один раз создается соединение и нет нужны создавать его снова и снова
  • 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;
	}
}

+ Ленивая инициализация
+ Высокая производительность
— Невозможно использовать для не статических полей класса

Будут вопросы/предложения — пишите в комментарии!


См. также мои другие статьи:
Тестовое задание: «Написать Интерпретатор на язык BrainFuck»
Тестовое задание «Image Comparison»
Java — быстрее, сильнее и выше! Зарплаты украинских программистов.
История успеха спустя 1.5 года от начала обучения
Технические вопросы на собеседовании.
Как найти работу? Рассылка резюме
Профессиональное выгорание. Как устоять?
Английский для IT и для собеседования
Паттерн Command своими словами.
Паттерн Singleton своими словами.
Как создать исполняемый jar в Intellij IDEA / how to create jar in IDEA
Помогите, нужна мотивация!

Подписывайтесь на мой блог Паттерны Проектирования пишите в нем статьи!

5 комментариев

Fry
  • Fry
  • +2
Отлично.
Автор, можно еще добавить double checked singleton, enum singleton, on demand holder idiom with nested static class.
Roman_kh
Есть такое дело..)
Alejandro_Kolio
А еще и синглтон при сериализации, тоже неплохо бы напомнить (readResolve())
Roman_kh
в студию!
Alejandro_Kolio
  • Alejandro_Kolio
  • +1
  • Комментарий отредактирован 2017-02-21 15:35:24 пользователем Alejandro_Kolio
хорошо описана Сериализация объектов Singleton: вот тут, также это хорошо описано у Дж.Блоха в «Effective Java»
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.