Какова логика работы метода getInstance?

Как работает метод getInstance в классе Singleton и почему конструктор помещен в private? Мне нужно понять логику работы этого метода, так как информации в документации не обнаружено. Поясните, по какой логике здесь работает метод getInstance, и почему конструктор помещен в private.
  • 13 января 2024 г. 20:28
Ответы на вопрос 2
Метод `getInstance()` в классе Singleton используется для обеспечения гарантии того, что у класса существует только один экземпляр (инстанс). Это ключевая идея паттерна одиночка (Singleton).

Основная логика работы метода `getInstance()`:

1. Проверка существует ли уже созданный экземпляр класса Singleton (то есть не равен ли `null` статическому приватному полю, хранящему этот экземпляр).
   
   - Если экземпляр уже существует, метод возвращает ссылку на этот существующий экземпляр.
   - Если экземпляр еще не создан, то он создается и сохраняется в статическую переменную.

2. Возврат экземпляра класса Singleton.

Конструктор класса Singleton делается приватным (`private`) для того, чтобы предотвратить создание экземпляра класса извне с помощью оператора `new`. Это ключевой момент, который обеспечивает, что экземпляр класса Singleton может быть создан только внутри самого класса Singleton.

Пример реализации класса Singleton в Java:

```java
public class Singleton {
    // Статическая переменная, хранящая единственный экземпляр класса
    private static Singleton instance;

    // Приватный конструктор, который предотвращает создание экземпляра снаружи
    private Singleton() {}

    // Метод для получения экземпляра класса Singleton
    public static Singleton getInstance() {
        // Проверяем, был ли уже создан экземпляр
        if (instance == null) {
            // Если нет, создаем экземпляр
            instance = new Singleton();
        }
        // Возвращаем существующий или только что созданный экземпляр
        return instance;
    }
}
```

Когда метод `getInstance()` вызывается, происходит следующее:

1. Если `instance` равен `null`, то при первом вызове метода создается новый экземпляр класса.
2. Если `instance` не равен `null`, то метод просто возвращает существующий экземпляр.

Таким образом, гарантируется, что экземпляр класса Singleton существует в единственном числе, и доступ к нему может быть получен из любой точки программы с помощью метода `getInstance()`. Все последующие обращения к этому методу будут возвращать тот же самый экземпляр, что обеспечивает глобальную точку доступа к экземпляру класса.
Тут логика такая: при первой попытке получить синглтон он будет инстанцирован. 
Конструктор приватный для того, что бы не было возможности инстанцировать синглтон никак иначе, как через метод getInstance.

Но подразумевается, что всё-таки правильная конструкция должна быть
Singleton single = new Singleton();

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

Вот неплохая статья по этому поводу: https://habr.com/ru/articles/129494/
Похожие вопросы