Шаблон синглтон

В разработке программного обеспечения синглтон — это шаблон проектирования программного обеспечения , который ограничивает создание экземпляра класса шаблон единственным экземпляром. Один из известных шаблонов проектирования «Банда четырёх» , описывающий, как решать повторяющиеся проблемы в объектно-ориентированном программном обеспечении . [1] шаблон полезен, когда для координации действий в системе необходим ровно один объект.
Более конкретно, шаблон Singleton позволяет объектам: [2]
- Убедитесь, что у них есть только один экземпляр
- Обеспечьте легкий доступ к этому экземпляру
- например, скрывая конструкторы класса Управляйте их созданием ( )
Этот термин происходит от математической концепции синглтона .
Обычное использование
[ редактировать ]Синглтоны часто предпочтительнее глобальных переменных , поскольку они не загрязняют глобальное пространство имен (или содержащее их пространство имен). Кроме того, они допускают ленивое выделение и инициализацию, тогда как глобальные переменные во многих языках всегда потребляют ресурсы. [1] [3]
Шаблон Singleton также можно использовать в качестве основы для других шаблонов проектирования, таких как абстрактная фабрика , фабричный метод , шаблоны построения и прототипа . Фасадные объекты также часто являются одиночными, поскольку требуется только один фасадный объект.
Ведение журнала — распространенный реальный вариант использования синглтонов, поскольку всем объектам, которые хотят регистрировать сообщения, требуется единая точка доступа и концептуально запись осуществляется в один источник. [4]
Реализации
[ редактировать ]Реализация шаблона Singleton гарантирует, что когда-либо существует только один экземпляр класса Singleton, и обычно обеспечивает глобальный доступ к этому экземпляру.
Обычно это достигается путем:
- Объявление всех конструкторов класса частными , что предотвращает создание его экземпляров другими объектами.
- Предоставление статического метода , который возвращает ссылку на экземпляр.
Экземпляр обычно хранится как частная статическая переменная ; экземпляр создается при инициализации переменной, в какой-то момент до первого вызова статического метода.
Эта реализация C++11 основана на реализации до C++98, описанной в книге. [ нужна ссылка ] .
#include <iostream>
class Singleton {
public:
// defines an class operation that lets clients access its unique instance.
static Singleton& get() {
// may be responsible for creating its own unique instance.
if (nullptr == instance) instance = new Singleton;
return *instance;
}
Singleton(const Singleton&) = delete; // rule of three
Singleton& operator=(const Singleton&) = delete;
static void destruct() {
delete instance;
instance = nullptr;
}
// existing interface goes here
int getValue() {
return value;
}
void setValue(int value_) {
value = value_;
}
private:
Singleton() = default; // no public constructor
~Singleton() = default; // no public destructor
static Singleton* instance; // declaration class variable
int value;
};
Singleton* Singleton::instance = nullptr; // definition class variable
int main() {
Singleton::get().setValue(42);
std::cout << "value=" << Singleton::get().getValue() << '\n';
Singleton::destruct();
}
Вывод программы
value=42
Это реализация синглтона Мейерса. [5] в С++11. Синглтон Мейерса не имеет метода разрушения. Вывод программы такой же, как указано выше.
#include <iostream>
class Singleton {
public:
static Singleton& get() {
static Singleton instance;
return instance;
}
int getValue() {
return value;
}
void setValue(int value_) {
value = value_;
}
private:
Singleton() = default;
~Singleton() = default;
int value;
};
int main() {
Singleton::get().setValue(42);
std::cout << "value=" << Singleton::get().getValue() << '\n';
}
Ленивая инициализация
[ редактировать ]Одноэлементная реализация может использовать отложенную инициализацию , при которой экземпляр создается при первом вызове статического метода. В многопоточных программах это может вызвать состояние гонки , приводящее к созданию нескольких экземпляров. Следующий Java 5+ пример [6] — это потокобезопасная реализация, использующая ленивую инициализацию с двойной проверкой блокировки .
public class Singleton {
private static volatile Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
Критика
[ редактировать ]Некоторые считают синглтон антишаблоном , который вводит глобальное состояние в приложение, часто без необходимости. Это приводит к потенциальной зависимости других объектов от синглтона, что требует анализа деталей реализации, чтобы определить, существует ли зависимость на самом деле. [7] Эта повышенная связанность может создать трудности при модульном тестировании . [8] В свою очередь, это накладывает ограничения на любую абстракцию, использующую синглтон, например, предотвращает одновременное использование нескольких экземпляров. [8] [9] [10]
Синглтоны также нарушают принцип единой ответственности , поскольку они несут ответственность за обеспечение своей уникальности наряду с выполнением своих обычных функций. [8]
См. также
[ редактировать ]- Идиома держателя инициализации по требованию
- Многотонный узор
- Шаблон проектирования программного обеспечения
Ссылки
[ редактировать ]- ^ Jump up to: а б Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес (1994). Шаблоны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования . Эддисон Уэсли. стр. 127 и далее . ISBN 0-201-63361-2 .
{{cite book}}
: CS1 maint: несколько имен: список авторов ( ссылка ) - ^ «Шаблон проектирования Singleton — проблема, решение и применимость» . w3sDesign.com . Проверено 16 августа 2017 г.
- ^ Сони, Девин (31 июля 2019 г.). «Что такое синглтон?» . Лучшее программирование . Проверено 28 августа 2021 г.
- ^ Райнсбергер, Дж. Б. (1 июля 2001 г.). «Используйте синглтоны с умом» . ИБМ. Архивировано из оригинала 24 февраля 2021 года . Проверено 28 августа 2021 г.
- ^ Скотт Мейерс (1997). Более эффективный C++ . Эддисон Уэсли. стр. 146 и далее. ISBN 0-201-63371-Х .
- ^ Эрик Фриман, Элизабет Фриман, Кэти Сьерра и Берт Бейтс (октябрь 2004 г.). «5: Единственные в своем роде объекты: шаблон Singleton» . Шаблоны проектирования Head First (первое изд.). О'Рейли Медиа, Инк. с. 182. ИСБН 978-0-596-00712-6 .
{{cite book}}
: CS1 maint: несколько имен: список авторов ( ссылка ) - ^ «Почему синглтоны вызывают споры» . Архив кода Google . Архивировано из оригинала 6 мая 2021 года . Проверено 28 августа 2021 г.
- ^ Стив Йегге. Одиночек считают глупыми , сентябрь 2004 г.
- ^ Хевери, Мишко, « Глобальное состояние и синглтоны », Clean Code Talks , 21 ноября 2008 г.
Внешние ссылки
[ редактировать ]![]() | в этой статье Использование внешних ссылок может не соответствовать политике и рекомендациям Википедии . ( Ноябрь 2016 г. ) |


- Полная статья « Объяснение шаблона Java Singleton »
- Четыре разных способа реализации синглтона в Java « Способы реализации синглтона в Java »
- Отрывок из книги: Реализация шаблона Singleton в C# Джона Скита.
- Синглтон в Центре разработчиков шаблонов и практик Microsoft
- Статья IBM « Блокировка с двойной проверкой и шаблон Singleton » Питера Хаггара
- Гири, Дэвид (25 апреля 2003 г.). «Как ориентироваться в обманчиво простом шаблоне Singleton» . Шаблоны проектирования Java. JavaWorld . Проверено 21 июля 2020 г.
- Google Singleton Detector (анализирует байт-код Java для обнаружения синглтонов)