Примеры использования Паттерн Singleton (Одиночка) | страница 2
class Singleton {
static Singleton* _self;
protected:
Singleton(){}
public:
static Singleton* Instance() {
if (!_self) _self = new Singleton();
return _self;
}
//методы
void aFunc1();
void aFunc2();
//данные
int aData;
>};
>Singleton* Singleton::_self=NULL;
ПРИМЕЧАНИЕ Конструктор класса объявлен в защищенной секции. Благодаря этому отсутствует возможность создавать объекты класса по оператору new или статически. Вместо этого для конструирования объекта служит метод Instance(), который гарантирует, что в программе будет существовать только один экземпляр данного класса.
Таким образом, класс Singleton инкапсулирует в себе методы и свойства данной сущности, может быть доступен из любого места программы благодаря методу Instance(), а, кроме того, теперь мы можем управлять временем жизни этого объекта. Вот пример использования класса Singleton:
>#include "app.h"
>void main() {
> Application* application = Application::Instance();
> application->Run();
> delete application;
>}
>#include
>using std::string;
>class Window;
>class Application {
> static Application* _self;
> Window *wnd;
>protected:
> Application(){}
>public:
> static Application* Instance();
> int loadIniInt(string& section, string& var);
> void saveIniInt(string& section, string& var, int val);
> void Run();
>};
>Application* Application::Instance() {
> if(!_self) _self = new Application();
> return _self;
>}
>int Application::loadIniInt(string& section, string& var) {
> printf("loadIni\n");
> return 100;
>}
> void Application::saveIniInt(string& section, string& var, int val) {
> printf("saveIni\n");
>}
>void Application::Run() {
> wnd=new Window();
> //цикл обработки сообщений
> delete wnd;
>}
>Application* Application::_self=NULL;
>#include "app.h"
>class Window {
> int width;
> int height;
>public:
> Window() {
> Application *p=Application::Instance();
> p->loadIniInt(string("Window"), string("width"));
> p->loadIniInt(string("Window"), string("height"));
> }
> ~Window() {
> Application *p=Application::Instance();
> p->saveIniInt(string("Window"), string("width"), width);
> p->saveIniInt(string("Window"),string("height"), height);
> }
>};
Этот листинг показывает, как можно организовать каркас оконного приложения, используя паттерн Singleton. Из класса окна требуется доступ к некоторым функциям объекта Application. Поскольку объект приложения существует всегда в одном экземпляре, то он реализует паттерн Singleton, а доступ к объекту приложения из объекта окна осуществляется благодаря методу Instance().