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

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

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность. Книга завершается финалом, связывающим воедино темы и сюжетные линии, исследуемые на протяжении всей истории. В целом, книга представляет собой увлекательное и наводящее на размышления чтение, которое исследует человеческий опыт уникальным и осмысленным образом.

Жанр: Программирование
Серии: -
Всего страниц: 4
ISBN: -
Год издания: Не установлен
Формат: Полный

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

Шрифт
Интервал

Проблемы, связанные с глобальными объектами

При разработке больших проектов, часто возникает необходимость обращаться из одного модуля программы к объектам, существующим в другом модуле. Такие объекты, как правило, существуют в единичных экземплярах, поэтому наиболее распространенной практикой является создание глобальных объектов данного типа и ссылка на них из других модулей программы с применением ключевого слова extern. Так, например, при создании ATL проекта в среде MSVC++, мастер проекта создает экземпляр класса – наследника от CComModule, _Module, в главном файле проекта, и помещает объявление extern CMyModule _Module в stdafx.h, что делает доступным объект _Module из других файлов проекта. Однако при таком подходе отсутствует механизм, предотвращающий создание нескольких объектов данного типа. Кроме того, поскольку объект создается статически, отсутствует возможность управлять процессом его создания. То есть, объект создается автоматически, до момента его фактического применения в программе. Это может приводить к некоторым неприятным последствиям: если объект работает с некоторой инфраструктурой, то инициализация и освобождение этой инфраструктуры должны быть помещены, например, в этот же класс.

листинг 1

>class BusinesLogic //использует инфраструктуру COM

>{

>public:

> BusinesLogic () {

>  CoInitializeEx(NULL, COINIT_MULTITHREADED);

>  //некая работа с COM

> }

> ~BusinesLogic () {

>  CoUninitialize();

> }

>};


Глядя на следующий фрагмент, нельзя сказать, была ли инициализирована инфраструктура, а если да, то ничего нельзя сказать о выбранной потоковой модели COM. Как следствие, такой код – источник ошибок и возможных проблем с их диагностикой.

листинг 2

>BusinesLogic BL;


>void main() {

> HRESULT hr;

> IUnknown *p;

> hr=CoCreateInstance(CLSID_AppartmentThreadClass, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&p);

>}


При наличии в программе двух глобальных объектов, ссылающихся друг на друга, помещенных в разных модулях, может возникнуть ситуация, при которой один объект попытается обратиться к другому, еще не созданному объекту.

Выходом является использование паттерна проектирования Singleton. Его особенностью является то, что он гарантирует существование объекта в единственном экземпляре, а самое главное, то, что он создается в тот момент, когда это требуется клиенту. Последующие попытки конструирования объекта приводят лишь к возвращению клиенту ссылки на уже существующий объект, но не к созданию нового. Вот пример класса, реализующего логику паттерна Singleton:

Листинг 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().

Проблема удаления объекта “Singleton”.


Еще от автора Дмитрий Федоров
Виктор Тихонов. Жизнь во имя хоккея

Виктор Васильевич Тихонов – легенда советского и российского хоккея. В качестве главного тренера сборной он трижды добился с командой золотых медалей на Олимпиадах, восемь раз его команда завоевала титул чемпиона мира, а команда ЦСКА двенадцать раз становилась чемпионом СССР. Каким он был, «Мистер Дисциплина»? Как ему удалось добиться с командой таких успехов? Ответы на эти вопросы – в его дневниках и воспоминаниях супруги, Татьяны Васильевны, а также – в фотографиях из их личного архива.


Загольная жизнь

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Удар из галактики

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Города Алисы

«Города Алисы» — сериал коротких приключенческих рассказов, действие которых происходит в красивых городах. Лондон, Хельсинки, Нью-Йорк, Мюнхен, Кёльн, Рим. Главная героиня — энергичная девушка Алиса. Умная, с чувством юмора, немного желчная, красивая, при этом не стерва, стильная, но не гламурная. Стоит ей только покинуть Россию, как вокруг неё сразу начинают происходить нереальные события, и люди с чудинкой оказываются на её пути. У Алисы есть коммуникабельный и доброжелательный пёс — грифон по кличке Соломон.


Отдыхай с Гусом Хиддинком: четыре анекдотичные футболяшки

«Отдыхай с Гусом Хиддинком» – четыре нереально смешные фантастические истории, герои которых существуют в каком-то странном пространстве – то ли виртуальном, то ли со смещенным временем, то ли вообще в мире галлюцинаций. В День национального единства русские гении – Пушкин, Достоевский и другие – играют против Рональдинью, Джеррарда, Анри и прочих звезд мира.Со школы знакомые картины, вроде «Грачи прилетели», становятся фанатскими баннерами, а Гоголь переделывает бессмертного «Резизора» под актуальные футбольные нужды.Руководство «Спартака» придумывает радикальный пиар-ход, чтобы стать ближе к народу.


Голевой телекинез. Фельетон-фэнтези

Повод: Отечественные футбольные клубы готовятся к битве в еврокубках, в российской премьер-лиге наступает пора решающих матчей. Менеджеры команд готовы на все, чтобы добиться победного результата.


Рекомендуем почитать
Трилобиты: Свидетели эволюции

Перед нами первая популярная книга на русском языке о трилобитах. Миллионы лет назад эти необычайные животные самых немыслимых форм и размеров, хищные и смирные, крошки и гиганты, царили в океанах и на суше… а потом исчезли. О загадках их ушедшей жизни интеллигентно и остроумно рассказывает Ричард Форти, большой знаток трилобитов, влюбленный в них с самого детства. Читатель не только получит основательные сведения о трилобитах и их современниках. Он почувствует поступь эволюции, которая произвела на свет этих существ, позволила им сначала триумфально шествовать по океанам и эпохам, а потом—таинственно исчезнуть.


Народные русские сказки из собрания А.Н. Афанасьева

В этот сборник вошли самые популярные народные русские сказки из знаменитого собрания известного фольклориста, литературоведа и историка А. Н. Афанасьева.Впервые эти сказки изданы с таким большим количеством замечательных классических иллюстраций.


Лекарство для доктора

Несмотря на суровые испытания, через которые довелось пройти Брайен Баррингтон, она твердо верит, что человек создан для любви и счастья. Но как ей убедить в этом Джеда Савьера? Справится ли юная девушка с такой нелегкой задачей?


Ночь, которая решила все

В рождественскую ночь Оливия Макговерн, уступив внезапно вспыхнувшей безумной страсти, отдалась Лукасу Хантеру, человеку, которого почти не знала… и забеременела.Может ли страсть положить начало крепкой семье?..


Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.