Реализация шаблона проектирования в C ++
https://learntutorials.net/ru/cplusplus/topic/4335/%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%B2-c-plusplus
Реализация шаблона проектирования в C ++
Реализация шаблона проектирования в C ++ : Singleton
http://cpp-reference.ru/patterns/
http://cpp-reference.ru/patterns/creational-patterns/singleton/
Singleton
Улучшенная версия классической реализации Singleton
http://cpp-reference.ru/patterns/creational-patterns/singleton/
Singleton
Код: Выделить всё
// Singleton.h
class Singleton1
{
private:
Singleton1() { }
Singleton1( const Singleton1& );
Singleton1& operator=( Singleton1& );
public:
static Singleton1& getInstance() {
static Singleton1 instance;
return instance;
}
};
class Singleton2
{
private:
Singleton2( Singleton1& instance): s1( instance) { }
Singleton2( const Singleton2& );
Singleton2& operator=( Singleton2& );
Singleton1& s1;
public:
static Singleton2& getInstance() {
static Singleton2 instance( Singleton1::getInstance());
return instance;
}
};
// main.cpp
#include "Singleton.h"
int main()
{
Singleton2& s = Singleton2::getInstance();
return 0;
}
Код: Выделить всё
// Singleton.h
class Singleton; // опережающее объявление
class SingletonDestroyer
{
private:
Singleton* p_instance;
public:
~SingletonDestroyer();
void initialize( Singleton* p );
};
class Singleton
{
private:
static Singleton* p_instance;
static SingletonDestroyer destroyer;
protected:
Singleton() { }
Singleton( const Singleton& );
Singleton& operator=( Singleton& );
~Singleton() { }
friend class SingletonDestroyer;
public:
static Singleton& getInstance();
};
// Singleton.cpp
#include "Singleton.h"
Singleton * Singleton::p_instance = 0;
SingletonDestroyer Singleton::destroyer;
SingletonDestroyer::~SingletonDestroyer() {
delete p_instance;
}
void SingletonDestroyer::initialize( Singleton* p ) {
p_instance = p;
}
Singleton& Singleton::getInstance() {
if(!p_instance) {
p_instance = new Singleton();
destroyer.initialize( p_instance);
}
return *p_instance;
}