Примеры использования Паттерн Singleton (Одиночка) | страница 2



Листинг 3

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:

Модуль MAIN

>#include "app.h"

>void main() {

> Application* application = Application::Instance();

> application->Run();

> delete application;

>}


Модуль APP

>#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;

Модуль WINDOW

>#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().