Одиночка
Singleton
Назначение
Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.
Результаты
1. Класс Singleton инкапсулирует свой единственный экземпляр, он полностью контролирует то, как и когда клиенты получают доступ к нему.
2. Паттерн одиночка позволяет избежать засорения пространства имен глобальными переменными, в которых хранятся уникальные экземпляры.
3. От класса Singleton можно порождать подклассы, а во время выполнения создавать экземпляр класса, заданного в конфигурации.
4. Паттерн позволяет использовать и более одного экземпляра класса Singleton. Для этого нужно изменить операцию доступа к экземпляру класса.
Структура
Реализация
//
class Singleton {
int data; //
static Singleton *s;
//
Singleton(int d):data(d){}
//
Singleton(const Singleton &)=delete;
Singleton& operator=(const Singleton &)=delete;
public:
//
static Singleton *Instance();
~Singleton() { s=NULL; }
//
int getdata() const { return data; }
};
//
Singleton *Singleton::s=NULL;
Singleton *Singleton::Instance()
{ if(!s)
s=new Singleton(1);
return s;
}
//
int d=Singleton::Instance()->getdata();
Вариант реализации паттерна без возможности удаления клиентом экземпляра.
//
class Singleton {
int data; //
//
Singleton(int d):data(d){}
//
Singleton(const Singleton &)=delete;
Singleton& operator=(const Singleton &)=delete;
~Singleton() {}
public:
//
static Singleton &Instance();
//
int getdata() const { return data; }
};
//
Singleton &Singleton::Instance()
{ //
//
static Singleton s(1);
return s;
}
//
int d=Singleton::Instance().getdata();