Аналогия с реальным миром Солнце нашей солнечной системы – отличный пример синглетного паттерна. У всех планет нашей солнечной системы есть одно солнце, и у него есть глобальная точка доступа.
Что это? Синглтон – это шаблон творческого проектирования, который позволяет гарантировать, что класс имеет только один экземпляр и экземпляр имеет глобальную точку доступа
Шаблон одноэлементного проектирования решает такие проблемы, как:
- Как можно гарантировать, что класс имеет только один экземпляр?
- Как можно легко получить доступ к единственному экземпляру класса?
- Как класс может контролировать создание своего экземпляра?
- Как можно ограничить количество экземпляров класса?
Решение: Все реализации синглтона имеют эти общие шаги:
- Сделайте конструктор по умолчанию закрытым для управления созданием экземпляра класса
- Создайте статический метод создания, который под капотом использует частный конструктор для создания экземпляра, затем сохраняет его в статическом поле, и все последующие вызовы этого метода возвращают кэшированный объект
Диаграмма классов:
Пример:
Приведенный выше код будет работать для однопоточных приложений. Но существует вероятность того, что в многопоточной среде будет создано несколько объектов. Вот один из примеров сценария:
- Поток A вызывает метод getInstance и обнаруживает, что единственный экземпляр равен нулю, но прежде чем он сможет фактически создать экземпляр, он отключает контекст.
- Теперь появляется поток B и вызывает метод getInstance, переходит к созданию экземпляра и возвращает объект Sun.
- Когда поток А снова запланирован, начинается озорство. Поток уже прошел проверку условия if null и перейдет к созданию другого объекта Sun и назначит его onlyInstance. Теперь в дикой природе есть два разных звуковых объекта, один с нитью A и один с нитью B
Есть два тривиальных способа исправить это состояние гонки:
- Один из них заключается в добавлении synchronized в метод getInstance().
- синхронизированный общедоступный статический AirforceOne getInstance()
- Другой способ заключается в выполнении статической инициализации экземпляра, которая гарантированно будет потокобезопасной.
- частные статические военно-воздушные силы Один AirforceOne();
Псевдокод:
Преимущества:
- Класс имеет только один экземпляр.
- Вы получаете глобальную точку доступа к этому экземпляру.
- Одноэлементный объект инициализируется только в первый раз.
недостатки
- Нарушает Принцип единой ответственности.
- Шаблон требует специальной обработки в многопоточной среде, чтобы несколько потоков не создавали одноэлементный объект несколько раз.
- Трудно поддающийся модульному тестированию
Репозиторий кода Github: Код для одноэлементного шаблона можно найти в следующем репозитории github: Ссылка на репозиторий Github: Одноэлементный шаблон
Оригинал: “https://dev.to/amrindersinghdev/singleton-design-pattern-1p04”