template <typename T>
class Singleton
{
protected:
Singleton(){}
virtual~Singleton(){}
public:
static T* GetInstancePtr()
{
if (!m_pInstance)
{
m_pInstance=new T;
}
return m_pInstance;
}
static T GetInstance()
{
if (m_pInstance)
{
m_pInstance=new T;
}
return *m_pInstance;
}
static void ReleaseInstancePtr()
{
if (m_pInstance)
{
delete m_pInstance;
m_pInstance=nullptr;
}
}
public:
static T* m_pInstance;
};
template <typename T>
T* Singleton<T>::m_pInstance=nullptr;
class A :public Singleton<A>
{
public:
A(){}
~A(){}
public:
void Test(){printf("this is a A\n");}
};
//Singleton模式
class B
{
public:
B(){}
~B(){}
public:
void Test(){printf("this is a B\n");}
};
int _tmain(int argc, _TCHAR* argv[])
{
A::GetInstancePtr()->Test();
//A::GetInstancePtr()->GetInstancePtr()->GetInstancePtr()->Test();
A* pa1=A::GetInstancePtr();
A* pa2=A::GetInstancePtr();
pa1->Test();
pa2->Test();
A::ReleaseInstancePtr();
//OR
Singleton<A>::GetInstance().Test();
Singleton<A>::GetInstancePtr()->Test();
Singleton<A>::ReleaseInstancePtr();
Singleton<B>::GetInstance().Test();
Singleton<B>::GetInstance().Test();
Singleton<B>::ReleaseInstancePtr();
//Singleton模式
getchar();
return 0;
}
转载于:https://my.oschina.net/u/221120/blog/884195