1、简单的单例模式类
class singleton{
private:
singleton();
~singleton();
singleton(const singleton&);
singleton& operator=(const singleton&);
public:
static singleton* GetInstance(){
if(nullptr == instance){
lock();
if(nullptr == instance){
instance = new singleton();
}
unlock();
}
return singleton;
}
private:
static singleton instance* = nullptr;
}
2、在项目中可能会用到很多单例类,每个类都需要如上声明和定义,身为程序员,偷懒是一个好品质,所以我们需要一个单例模板类!实现的思路和上面的非模板类一样,入下:
template <typename T>
class singleton{
private:
singleton();
~singleton(){
if(nullpte != instance){
delete instance;
instance = nullptr;
}
}
singleton(const singleton&);
singleton& opretor=(const singleton&);
public:
static T* GetInstance(){
if(nullptr == instance){
lock();
if(nullptr == instance){
instance = new T();
}
unlock();
}
}
private:
static T* instance;
}
template <typename T>
T* singleton<T>::instance = nullptr;
如此,单例模板类边定义好了。
3、如何使用单例模板类
众所周知,单例模式的类需要把构造函数私有化,但是私有化后,模板类就无法访问到改类的构造函数,也就无法new T()。如何解决这个问题呢?当当当当!那就要用到有元类了,将模板类声明为单例类的有元类,那么模板类即可访问私有函数,如下:
class Foo{
private:
Foo();
~Foo();
friend class singleton<Foo>;
}
typedef singleton<Foo> FooSingleton; //方便使用
#define GetFoo() singleton<Foo>::GetInstance() //更方便一点,哇咔咔
酱紫就能方便开心的使用模板类了!
水平有限,有错误敬请指出,谢谢!