Одиночка (шаблон проектирования)

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Шаблон проектирования
Одиночка
Singleton
Тип:

порождающий

Описан в Design Patterns

Да

Одиночка (англ. Singleton) в программировании — порождающий шаблон проектирования.

Содержание

Цель [править]

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

Плюсы [править]

  • контролируемый доступ к единственному экземпляру.

Минусы [править]

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

Применение [править]

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

Примеры реализации [править]

Пример на Java 1.6: Без внутренних классов (ленивая несинхронизированная реализация). [править]

Пример на Java 1.5: с отложенной инициализацией [править]

Пример на Java 1.5: Class holder on JVM start initialization [править]

Пример на Java 1.5: Enum singleton [править]

Пример на Python [править]

Пример на C++ [править]

Ниже приведена одна из возможных реализаций синглтона на C++ (известная как синглтон Майерса), где одиночка представляет собой статический локальный объект. Важным моментом является то, что конструктор класса объявлен как private, что позволяет предотвратить создание экземпляров класса за пределами его реализации. Помимо этого, закрытыми также объявлены конструктор копирования и оператор присваивания. Последние следует определять, так как это позволяет в случае их случайного вызова из кода получить легко обнаруживаемую ошибку компоновки. Отметим также, что приведенный пример не является потокобезопасным в С++03, для работы с классом из нескольких потоков нужно защитить переменную theSingleInstance от одновременного доступа, например, с помощью мьютекса или критической секции. Впрочем, в C++11 синглтон Майерса является потокобезопасным и без всяких блокировок.

Ещё один пример реализации одиночки на C++ с возможностью наследования для создания интерфейса, каркасом которого послужит, собственно, одиночка. Временем «жизни» единственного объекта удобно управлять, используя механизм подсчета ссылок.

Пример на C# [править]

Пример на PHP 4 [править]

Пример на PHP 5 [править]

Пример на Delphi [править]

Для Delphi 2005 и выше подходит следующий пример (не потоко-безопасный):

Для более ранних версий следует переместить код класса в отдельный модуль, а объявление Instance заменить объявлением глобальной переменной в его секции implementation (до Delphi 7 включительно секции class var и strict private отсутствовали).

Пример на языке Io [править]

Пример на языке Ruby [править]

Пример на Common Lisp [править]

Пример на VB.NET [править]

Пример на Perl [править]

Пример на ActionScript 3 [править]

Пример на CoffeeScript [править]

Пример на JavaScript с инкапсуляцией [править]

Пример на Objective-C [править]

См. также [править]

Ссылки [править]

Примечания [править]