Рубрики
Без рубрики

Шаблон Одноэлементного дизайна

Аналогия реального мира Солнце нашей солнечной системы является отличным примером синглетного паттерна. Все… Помечено ооп, java, дизайн программного обеспечения, архитектура.

Аналогия с реальным миром Солнце нашей солнечной системы – отличный пример синглетного паттерна. У всех планет нашей солнечной системы есть одно солнце, и у него есть глобальная точка доступа.

Что это? Синглтон – это шаблон творческого проектирования, который позволяет гарантировать, что класс имеет только один экземпляр и экземпляр имеет глобальную точку доступа

Шаблон одноэлементного проектирования решает такие проблемы, как:

  • Как можно гарантировать, что класс имеет только один экземпляр?
  • Как можно легко получить доступ к единственному экземпляру класса?
  • Как класс может контролировать создание своего экземпляра?
  • Как можно ограничить количество экземпляров класса?

Решение: Все реализации синглтона имеют эти общие шаги:

  • Сделайте конструктор по умолчанию закрытым для управления созданием экземпляра класса
  • Создайте статический метод создания, который под капотом использует частный конструктор для создания экземпляра, затем сохраняет его в статическом поле, и все последующие вызовы этого метода возвращают кэшированный объект

Диаграмма классов:

Пример:

Приведенный выше код будет работать для однопоточных приложений. Но существует вероятность того, что в многопоточной среде будет создано несколько объектов. Вот один из примеров сценария:

  • Поток 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”