Как работает паттерн Singleton
Источник:
Dev.to
Как известно, паттерн Singleton позволяет создавать только один экземпляр из класса. Давайте рассмотрим случай, когда вашему приложению требуется доступ к общему ресурсу из разных мест в разное время, сохраняя согласованное состояние между каждым доступом.
![Кофе-брейк #106. Почему Set может содержать повторяющиеся элементы. Как работает паттерн Singleton - 2]()
Паттерн Singleton решает эту проблему, создавая класс, который отвечает за создание только одного экземпляра, разрешая при этом прямой доступ к экземпляру объекта.
Где применяется Singleton
Singleton можно использовать в случаях, когда у класса есть только один доступный экземпляр. Например:
![Кофе-брейк #106. Почему Set может содержать повторяющиеся элементы. Как работает паттерн Singleton - 3]()
Участники
Singleton: определяет операцию экземпляра, которая позволяет клиентам получить доступ к его уникальному экземпляру.
Взаимодействие
Клиенты получают доступ к экземпляру Singleton только через метод getInstance.
Преимущества
- Можно быть уверенным в количестве экземпляров.
- Можно получить доступ к экземпляру из любого места в коде.
Недостатки
- Нарушает принцип единой ответственности, поскольку отвечает за создание одного экземпляра и обеспечивает основные функции самого объекта.
- Модульное тестирование проводить сложнее, потому что трудно изолировать глобальные состояния.
- Делает объект глобально изменяемым (обеспечивает доступ из любого места в коде), что в некоторых случаях может быть нежелательным.
Выполнение
Синглтоны могут быть реализованы разными способами:
- Стремительная инициализация: объект класса создается при загрузке в память.
- Ленивая инициализация: в этом методе объект создается только в случае необходимости.
- Потокобезопасный синглтон: создается потокобезопасный синглтон, чтобы свойство синглтона сохранялось даже в многопоточной среде.
Демо
Деньги, полученные посетителями кафе, хранятся в кассе. Важно, чтобы в каждом кафе был только один кассовый аппарат, чтобы доход кафе был точно известен.
Чтобы решить эту проблему, мы реализуем
CashRegister как синглтон. Для этого мы делаем конструктор закрытым, чтобы никто не мог создать экземпляр класса. Также мы реализуем метод
getInstance, который будет вызываться пользователем для получения экземпляра класса.
Файл
main.java:
public class Main {
public static void main(String[] args) {
CashRegister register = CashRegister.getInstance();
register.setMoney(1221.0);
System.out.println(register.getMoney().toString());
CashRegister register1 = CashRegister.getInstance();
System.out.println(register1.getMoney().toString());
}
}
Файл
CashRegister.java:
public final class CashRegister {
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
private Double money;
private CashRegister(){}
private static final CashRegister INSTANCE = new CashRegister();
public static CashRegister getInstance(){
return INSTANCE;
}
}
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ