单例模式 c++实现
singleton.h:
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
// Singleton 模式
#include "sync.h"
// #define NULL ((void *)0)
template <typename T>
class Singleton
{
private:
Singleton() {}; // ctor hidden
Singleton (Singleton const&); // copy ctor hidden
Singleton & operator=( Singleton const&); // assign op. hidden
~ Singleton (); // dtor hidden
static T* instance_;
public:
static T* Instance()
{
// double-check locking
if (instance_ == NULL)
{
static CSync sync;
sync.Lock();
if (instance_ == NULL)
instance_ = new T();
sync.Unlock();
}
return instance_;
}
};
template <typename T>
T* Singleton<T>::instance_ = NULL;
#endif // #ifndef _SINGLETON_H_
sync.h:
#ifndef _SYNC_
#define _SYNC_
#include <windows.h>
// critical_section
class CSync
{
private:
void operator=(const CSync&);
CSync(const CSync&);
CRITICAL_SECTION critical_section_;
public:
CSync() { InitializeCriticalSection(&critical_section_); }
~CSync() { DeleteCriticalSection(&critical_section_); }
void Lock() { EnterCriticalSection(&critical_section_); }
void Unlock() { LeaveCriticalSection(&critical_section_); }
};
#endif // #ifndef _SYNC_
test.cpp:
#include <iostream>
#include "singleton.h"
using namespace std;
class Mango
{
public:
Mango() { cout << "Mango Constructor(). " << endl; }
};
int main()
{
Mango* m1 = Singleton<Mango>::Instance();
Mango* m2 = Singleton<Mango>::Instance();
cout << m1 << "\n" << m2 << endl;
return 0;
}
浙公网安备 33010602011771号