Инструменты пользователя

Инструменты сайта


singleton

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

singleton [2012/10/12 10:01] (текущий)
Строка 1: Строка 1:
 +====== Шаблон Синглетон (Singleton pattern) ======
 +  * [[wpru>​Синглтон (шаблон проектирования)]]
 +  * [[http://​habrahabr.ru/​post/​103681/​|Singleton (Одиночка) или статический класс?​]]
 +Одним из применений статических членов является конструкция под названием Singleton pattern. Данная конструкция позволяет создавать только один экземпляр класса,​ и обеспечивает глобальный доступ к этому экземпляру. ​
 +
 +Иногда бывает очень важно, чтобы класс мог создать только один экземпляр (объект). Например,​ система может иметь несколько принтеров,​ но должен быть только один спулер принтера. Как мы можем гарантировать,​ что имеется только один экземпляр класса,​ и что этот экземпляр доступен?​! Можно, например,​ объявить глобальную переменную. Однако,​ данный способ плох тем, что мы во-первых засоряем пространство имен, а во-вторых не можем предотвратить создание нескольких экземпляров класса. ​
 +
 +Лучшим решением будет класс, который сам отслеживает создание экземпляров и доступ к единственному объекту. Мы можем сделать так, чтобы класс гарантировал,​ что никакой другой экземпляр не может быть создан. ​
 +
 +Надо написать класс, у которого можно создать только один экземпляр,​ но этим экземпляром должны пользоваться объекты других классов.
 +====== Singleton и С++ ======
 +Класс, у которого можно создать только один экземпляр,​ но этим экземпляром могут пользоваться объекты других классов.
 +<​file>​
 +# include <​iostream>​
 +using namespace std;
 +
 +class Singleton{ ​
 +
 +private: ​
 +
 + // указатель на единственный экземпляр класса
 + static Singleton*s;  ​
 + int k; 
 +
 + //​закрытый конструктор
 + Singleton(int i){
 + k = i;
 + }  ​
 +
 +public:
 + //​функция для получения указателя на 
 + //​единственный экземпляр класса
 + static Singleton*getReference(){
 +    ​return s;
 + }  ​
 +
 + //​получение значения нестатического члена класса
 + int getValue(){
 + return k;
 + }  ​
 +
 + //​перезапись значения нестатического члена класса
 + void setValue(int i){
 + k = i;
 +
 +};  ​
 +
 +// Инициализация статического члена класса.
 +Singleton* Singleton::​s=new Singleton(3); ​
 +
 +void main(){  ​
 +
 + //​получение указателя на 
 + //​единственный экземпляр класса
 + Singleton*p=Singleton::​getReference();​
 +
 + //​работа с компонентом объекта
 + cout<<​p->​getValue()<<"​\n\n";​
 + p->​setValue(p->​getValue()+5);​
 + cout<<​p->​getValue()<<"​\n\n";​
 +}
 +</​file> ​
 +Комментарии к примеру.
 +  * Класс Singleton окончательный — его нельзя расширить.
 +  * Его конструктор закрытый — никакой метод не может создать экземпляр этого класса.
 +  * Единственный экземпляр s класса Singleton — статический,​ он создается внутри класса.
 +  * Однако можно получить указатель на этот экземпляр методом getReference(),​ изменить состояние экземпляра s методом setValue() или просмотреть его текущее состояние методом getValue(). ​
 +
 +Безусловно,​ это только схема — класс Singleton надо еще наполнить полезным содержимым,​ но идея выражена ясно и полностью. ​
  
загрузка...
singleton.txt · Последние изменения: 2012/10/12 10:01 (внешнее изменение)