什么是单例模式?
保证一个类只有一个实例,并提供一个访问它的全局访问点。【DP】
让类的自身负责保存它的唯一实例,这个类保证没有其他实例可以被创建,并且此类可以提供一个访问该实例的方法。【DP】
什么时候需要单例模式?
程序只需要一个方法控制某项功能,不允许创建第二个此功能。比如:银行使用的取号机。
使用单例模式需要了解C++static关键字的用法我的这篇博文对static作了浅析
测试用例:
int main(){
//单例模式初始化两个实例的方法
Singleton *s1 = Singleton::getInstance();
Singleton *s2 = Singleton::getInstance();
if(s1 == s2)
std::cout << "Two the objects are the same instance.\n";
else
std::cout << "Two the objects are the different instance.\n";
return 0;
}
单例模式实现:
class Singleton{
private:
//将构造函数声明为私有的,从而保证只允许类内使用
Singleton(){}
//声明一个类的静态对象(类外初始化)
static Singleton *instance;
public:
//静态成员方法,提供一个访问仅有实例的全局访问点。即提供接口创建对象
static Singleton* getInstance(){
if(instance == NULL){
instance = new Singleton;
}
return instance;
}
};
//类外部初始化静态成员变量(静态成员变量必须被初始化)
Singleton* Singleton::instance = NULL;
附:若为多线程编程情况下,需要加锁并做两次判断是否为空。
class Singleton{
private:
//将构造函数声明为私有的,从而保证只允许类内使用
Singleton(){}
//声明一个类的静态对象(类外初始化)
static Singleton *instance;
public:
//静态成员方法,提供一个访问仅有实例的全局访问点。即提供接口创建对象
static Singleton* getInstance(){
if(instance != NULL){
lock(syncObj){
if(instance != NULL){
instance = new Singleton;
}//if
}//lock
}//if
return instance;
}
};
//类外部初始化静态成员变量(静态成员变量必须被初始化)
Singleton* Singleton::instance = NULL;
加lock是为了两个线程只有一个进入,另一个线程排队等候。第一个线程进入并出来后,后者才能进入。第二个判空是为了保证第一个线程创建了实例,第二个线程进入后就不再创建实例。