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

Шаблон 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.

Github: https://github.com/offthebench/java-from-scratch/tree/master/src/com/company/designpatterns/creational/singleton

Удачного обучения!