设计模式之单例模式
Singleton(单例)模式是最常见的,最容易实现,最应该掌握的设计模式。
单例模式解决的问题非常常见:如何去创建唯一的一个类对象(变量)?在C++语言中,通常维护一个静态成员变量来记录这一个唯一的对象,再通过一个静态接口instance来获取这一个实例。
结构图如下:
完整代码如下:
//Singleton.h
#ifndef SINGLETON_H
#define SINGLETON_H
#include <iostream>
using namespace std;
class Singleton {
public:
static Singleton* Instance() {
if(_instance == nullptr) {
return new Singleton();
}
return _instance;
}
protected:
Singleton() {
cout << "Singleton..." << endl;
}
private:
static Singleton* _instance;
};
Singleton* Singleton::_instance = 0;
#endif // SINGLETON_H
//main.cpp
#include "Singleton.h"
using namespace std;
int main() {
Singleton *sgn = Singleton::Instance();
return 0;
}
Singleton不能被初始化,因此构造函数被声明为protected或者private。
上述是线程不安全的,两个线程同时首次调用Instance()
方法,两个线程会同时构造一个`_instance
实例,这是错误的。
懒汉模式:第一次用到类实例时才会类实例化。
饿汉模式:在定义单例模式时就进行实例化。
懒汉模式为了线程安全必须加锁:
Singleton* Singleton::Instance() {
if(_instance == nullptr) {
pthread_mutex_lock(&mutex);
if(_instance == nullptr) {
return new Singleton();
}
pthread_mutex_lock(&mutex);
}
return _instance;
}
饿汉模式:在定义时实例化(线程安全的)
Singleton* Singleton::_instance = new Singleton();
Singleton* Singleton::Instance() {
return _instance;
}