На главную Содержание
Используется для создания объекта класса в единственном экземпляре.
Если создан один объект данного класса, дальнейшие попытки создания
объектов этого класса не дадут никаких результатов. Это обеспечивается
за счет присутствия в классе статической переменной, которая указывает,
был ли уже создан экземпляр класса.
E. Gamma, R. Helm, R. Johnson, J. Vlissides описывают шаблон Singleton
следующим образом: шаблон Singleton "проверяет что класс имеет только
один экземпляр и обеспечивает глобальную точку доступа к нему".
Схема взаимодействия классов:
Реализация на C++
class Singleton { private: static Singleton* instance_; int x;
protected: Singleton(): x(0){}
public: static Singleton* Instance() { if (instance_ == 0) { instance_ = new Singleton(); } return instance_; } void SetX(int newVal) {x = newVal;} int GetX()const {return x;} };
Singleton* Singleton::instance_ = 0;
int main() { int val; SingletonTest* pFirstSingleton = SingletonTest::Instance(); SingletonTest* pSecondSingleton = SingletonTest::Instance();
pFirstSingleton->SetX(4); cout << "Using the 1st singleton, set x to 4\n";
val = pSecondSingleton->GetX(); cout << "Variable from the 2nd singleton = " << val << '\n'; return 0; }
Реализация на C#
class Singleton { private static Singleton instance_;
public static Singleton Instance() { if (instance_ == null) instance_ = new Singleton(); return instance_; } protected Singleton(){}
private int x = 0; public void SetX(int newVal) {x = newVal;} public int GetX(){return x;} }
public class Client { public static int Main(string[] args) { int val; Singleton FirstSingleton = Singleton.Instance(); Singleton SecondSingleton = Singleton.Instance();
FirstSingleton.SetX(4); Console.WriteLine("Using the 1st singleton, set x to 4");
val = SecondSingleton.GetX(); Console.WriteLine("Value from the 2nd singleton = {0}", val); return 0; } }