Каждый шаблон проектирования является результатом разработки инженерами глобально применимых решений часто встречающихся проблем, с которыми они сталкиваются.
Шаблон Singleton решает две такие проблемы:
- Гарантирует, что класс имеет только один экземпляр.
- Предоставляет глобальную точку доступа к этому экземпляру.
Синглтон — это порождающий шаблон проектирования, который гарантирует, что класс имеет только один экземпляр, предоставляя при этом глобальную точку доступа к нему.
Аналогия с реальным миром
Рассмотрим на примере аэропорта и диспетчерскую вышку в нем, которая контролирует важные коммуникации между рейсами и наземным персоналом.
В каждом аэропорту есть диспетчерская вышка, и она обеспечивает связь всех рейсов, взлетающих или приземляющихся в аэропорту, с одной-единственной диспетчерской.
Диспетчерская вышка также является глобальной точкой доступа, которая идентифицирует ответственный диспетчерский персонал.
Структура
Все реализации Singleton имеют два общих шага:
- Конструктор по умолчанию должен быть закрытым, чтобы другие объекты не могли создавать экземпляры этого класса с помощью оператора new.
- Создайте статическую вспомогательную функцию getInstance(), которая вызывает закрытый конструктор для создания объекта и сохранения его в статическом поле.
Псевдокод
Наивная реализация класса Singleton:
public class Singleton { // The field for storing the singleton instance should be // declared static. private static Singleton instance; // The singleton's constructor should always be private to // prevent direct construction calls with the `new` // operator. private Singleton() { //Some initialization code. } // The static method that controls access to the singleton // instance. public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
Класс Singleton можно инициализировать разными способами:
- Усердная инициализация — экземпляр класса создается во время загрузки класса.
- Отложенная инициализация – экземпляр класса создается по мере необходимости.
- Thread-Safe: к экземпляру класса может обращаться только один поток за раз, что делает его потокобезопасным.
- Enum — поскольку значения Java Enum доступны глобально и создаются только один раз.
Плюсы
- Гарантирует, что класс имеет только один экземпляр.
- Доступ к экземпляру можно получить глобально в вашем приложении.
- Инициализируется только при необходимости.
Минусы
- Нарушает принцип единой ответственности.
- Сложно тестировать.
- Ошибки безопасности потоков.
- Также считается анти-шаблоном.
Мы подошли к концу нашей статьи, я надеюсь, что она дала вам представление о шаблонах проектирования и шаблонах проектирования Singleton.
Удачного обучения!