Шаблон Синглетон (Singleton pattern)

Одним из применений статических членов является конструкция под названием Singleton pattern. Данная конструкция позволяет создавать только один экземпляр класса, и обеспечивает глобальный доступ к этому экземпляру.

Иногда бывает очень важно, чтобы класс мог создать только один экземпляр (объект). Например, система может иметь несколько принтеров, но должен быть только один спулер принтера. Как мы можем гарантировать, что имеется только один экземпляр класса, и что этот экземпляр доступен?! Можно, например, объявить глобальную переменную. Однако, данный способ плох тем, что мы во-первых засоряем пространство имен, а во-вторых не можем предотвратить создание нескольких экземпляров класса.

Лучшим решением будет класс, который сам отслеживает создание экземпляров и доступ к единственному объекту. Мы можем сделать так, чтобы класс гарантировал, что никакой другой экземпляр не может быть создан.

Надо написать класс, у которого можно создать только один экземпляр, но этим экземпляром должны пользоваться объекты других классов.

Singleton и С++

Типовые задачи и решения языка CPP: Класс, у которого можно создать только один экземпляр, но этим экземпляром могут пользоваться объекты других классов.

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

Комментарии к примеру.

  • Класс Singleton окончательный — его нельзя расширить.
  • Его конструктор закрытый — никакой метод не может создать экземпляр этого класса.
  • Единственный экземпляр s класса Singleton — статический, он создается внутри класса.
  • Однако можно получить указатель на этот экземпляр методом getReference(), изменить состояние экземпляра s методом setValue() или просмотреть его текущее состояние методом getValue().

Безусловно, это только схема — класс Singleton надо еще наполнить полезным содержимым, но идея выражена ясно и полностью.

PQ VPS сервера в 28+ странах.