Паттерн «Одиночка» (Singleton)

Паттерн «Одиночка» (Singleton) известен тем, что он ограничивает создание экземпляра класса для одного объекта. В классическом стиле, паттерн «Одиночка» может быть реализован созданием  класса с методом, который создает новый экземпляр класса, если его не существует. В случае, если экземпляр уже существует, он просто возвращает ссылку на этот объект.

Паттерн «Одиночка» отличается от статических классов (или объектов) тем, что  мы можем задержать их инициализацию, потому что они требуют информацию, которая может быть недоступна во время инициализации.

В JavaScript «Одиночки» служат в качестве общего пространства имен ресурсов, которые изолируют код от глобального пространства имен (namespace) таким образом, чтобы обеспечить единую точку доступа для функции.

Мы можем реализовать «Одиночку» следующим образом:

Что позволяет «Одиночке» иметь  глобальный доступ к экземпляру (как правило, через MySingleton.getInstance())  в то время как мы (по крайней мере, в статических языках) вызываем  new MySingleton() напрямую. Однако, это возможно в JavaScript.

В книге GoF применение шаблона «Одиночка»описывается следующим образом:

  • Там должен быть ровно один экземпляр класса, и он должен быть доступен клиентам с известной точки доступа.
  • Когда единственный экземпляр должен быть расширяемым путем создания подклассов, и клиентам нужно иметь возможность использовать расширенный экземпляр без модификации своего кода.

Второй из этих пунктов относится к случаю, где нам может понадобиться такой код:

Здесь  getInstance становится немного похожим на метод  Factory, и нам не нужно обновлять постоянно код. FooSingleton выше в коде будет подклассом BasicSingleton и  будет реализовывать тот же интерфейс.

Почему отложенное выполнение считается важным для «Одиночки»?

В C++ он служит для изоляции от непредсказуемого порядка динамической инициализации, возвращая контроль  программисту.

Важно отметить разницу между статическим экземпляром класса (объекта) и «Одиночкой»в то время как последний может быть реализован как статический экземпляр, его можно создать «лениво», без ресурсов и памяти до тех пор, пока это не будет на самом деле необходимо.

Если у нас есть статический объект, который может быть инициализирован сразу же, нам нужно убедиться, что код всегда выполняется в том же порядке (напр., в случае objCar  нужен objWheel  во время его инициализации) и это не при наличии большого количества исходных файлов.

И «Одиночки» и статические объекты могут быть полезны, но ими не стоит злоупотреблять  — точно также как и  другими шаблонами.

На практике паттерн «Одиночка»  полезен, когда ровно один объект необходим для координации других в системе. Вот пример использования паттерна в этом контексте:

Источник: addyosmani.com

Оцените статью
Добавить комментарий