设计模式 单例模式
程序员文章站
2024-03-23 14:12:22
...
1.饿汉式
Singleton* Singleton::instance = nullptr;
Singleton* Singleton::GetInstance()
{
if(!instance)
{
instance = new Singleton();
}
return instance;
}
Singleton::Singleton()
{
// cstr
}
缺点:多线程不安全
- 饿汉式 线程安全
Singleton* Singleton::instance = nullptr;
Singleton* Singleton::GetInstance()
{
lock(instance);
if(!instance)
{
instance = new Singleton();
}
return instance;
}
Singleton::Singleton()
{
// cstr
}
缺点:效率不高
3. 饿汉式,多线程,双检测锁
Singleton* Singleton::instance = nullptr;
Singleton* Singleton::GetInstance()
{
if(!instance)
{
lock(instance);
if(!instance)
{
instance = new Singleton();
}
}
return instance;
}
Singleton::Singleton()
{
// cstr
}
- 懒汉式
Singleton* Singleton::instance = new Singleton();
Singleton* Singleton::GetInstance()
{
return instance;
}
Singleton::Singleton()
{
// cstr
}
- 多线程安全
- 如果类的初始化需要外部参数的话会比较麻烦。
另外,上面的方法是用的静态指针,这样会带来一个指针释放的问题。
如果采用饿汉式则可以声明为静态变量,这样就会自动释放:
Singleton* Singleton::instance = Singleton();
Singleton* Singleton::GetInstance()
{
return &instance;
}
Singleton::Singleton()
{
// cstr
}
如果仍然采用懒汉式的话,一种办法是添加一个静态的deleteInstance函数,由调用者自己释放。比如
void Singleton::deleteInstance()
{
if(!instance)
{
delete instance;
}
instance = nullptr;
}
如果担心遗忘,则可以在单例中使用内嵌类来做到自动回收:
class Singleton
{
public:
static Singleton* GetInstance();
private:
static Singleton* instance;
Singleton();
~Singleton()
{
instance = nullptr;
}
class GarbageCollect
{
public:
~GarbageCollect()
{
if(Singleton::instance)
{
delete Singleton::instance;
Singleton::instance = nullptr;
}
}
};
static GarbageCollect gc;
};
对象gc需要初始化。
当然,如果嫌自己回收太麻烦了,也可以不管,反正程序结束的时候系统会自动回收。