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

Одиночка (шаблон проектирования)
Шаблон проектирования
Одиночка
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

Для чего нужен Singleton (на пальцах)?

Пример на Delphi

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

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

Пример на языке Io

Пример на языке Ruby

Пример на Common Lisp

Пример на VB.NET

Пример на Perl

Пример на ActionScript 3

Пример на CoffeeScript

Пример на JavaScript с инкапсуляцией

Пример на Objective-C

См. также

Ссылки

Примечания



Wikimedia Foundation. 2010.

Игры ⚽ Поможем решить контрольную работу

Полезное


Смотреть что такое "Одиночка (шаблон проектирования)" в других словарях:

  • Шаблон проектирования — У этого термина существуют и другие значения, см. Паттерн. В разработке программного обеспечения, шаблон проектирования или паттерн (англ. design pattern) повторимая архитектурная конструкция, представляющая собой решение проблемы… …   Википедия

  • Интерфейс (шаблон проектирования) — Шаблон проектирования Интерфейс Interface Описан в Design Patterns Нет В информатике, шаблон интерфейса не является особым шаблоном среди шаблонов проектирования. Он является общим методом для структурирования компьютерных программ для того …   Википедия

  • Хранитель (шаблон проектирования) — Шаблон проектирования Хранитель Memento Тип: поведенческий Описан в Design Patterns Да Хранитель (также известный как Memento, Token, Лексема) поведенческий шаблон проектирования. Позволяет, не нарушая инкапсуляцию, зафикс …   Википедия

  • Итератор (шаблон проектирования) — Шаблон проектирования Итератор Iterator Тип: поведенческий Описан в Design Patterns Да Шаблон Iterator (также известный как Cursor)  Шаблон проектирования, относится к паттернам поведения. Представляет собой объект, позволяющий получить …   Википедия

  • Интерпретатор (шаблон проектирования) — Шаблон проектирования Интерпретатор Interpreter Тип: поведенческий Назначение: решает часто встречающуюся, подверженную изменениям задачу Описан в Design Patterns Да Шаблон Интерпретатор (англ.  …   Википедия

  • Компоновщик (шаблон проектирования) — Шаблон проектирования Компоновщик Composite Тип: структурный Описан в Design Patterns Да Компоновщик (англ. Composite pattern) шаблон проектирования, относится к структурным паттернам, объединяет объек …   Википедия

  • Состояние (шаблон проектирования) — Шаблон проектирования Состояние State Тип: поведенческий Описан в Design Patterns Да Состояние (англ. State)  шаблон проектирования. Используется в тех случаях, когда во время выполнения программы объект …   Википедия

  • Приспособленец (шаблон проектирования) — Шаблон проектирования Приспособленец Flyweight Тип: структурный Описан в Design Patterns Да Приспособленец (англ. Flyweight)  это объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не… …   Википедия

  • Адаптер (шаблон проектирования) — У этого термина существуют и другие значения, см. Адаптер. Шаблон проектирования Адаптер Adapter …   Википедия

  • Команда (шаблон проектирования) — У этого термина существуют и другие значения, см. Команда. Шаблон проектирования Команда Command Тип: поведенческий Назначение: для обработки команды в виде объекта …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»