Привет всем, 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;
}
}
+
Ленивая инициализация
+
Высокая производительность
-
Невозможно использовать для не статических полей класса
Будут вопросы/предложения — пишите в комментарии!
См. также мои другие статьи:
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Автор, можно еще добавить double checked singleton, enum singleton, on demand holder idiom with nested static class.