实现单例步骤
1、构造函数私有化
2、增加静态的私有的当前类的指针对象
3、提供静态的对外接口,可以让用户获得单例对象
单例分为懒汉式和饿汉式
在多线程环境下:懒汉式会造成线程不安全(解决方法:加锁),饿汉式线程安全。
懒汉式:只有调用getInstance时才会new一个对象;
class Singleton_lazy{
private:
Singleton_lazy(){
cout<<"我是懒汉式构造函数"<<endl;
}
public:
static Singleton_lazy* getInstance(){
if(pSingleton == NULL){
pSingleton = new Singleton_lazy;
}
return pSingleton;
}
private:
static Singleton_lazy* pSingleton;
};
//类外初始化
Singleton_lazy* Singleton_lazy::pSingleton = NULL;
饿汉式:类外初始化时直接new一个对象
class Singleton_hungry{
private:
Singleton_hungry(){
cout<<"我是饿汉式构造函数"<<endl;
}
public:
static Singleton_hungry* getInstance(){
return pSingleton;
}
private:
static Singleton_hungry* pSingleton;
};
//类外初始化
Singleton_hungry* Singleton_hungry::pSingleton = new Singleton_hungry;
int main(){
cout << "main函数开始执行"<<endl;
return 0;
}
//输出
我是饿汉式构造函数
main函数开始执行
int main(){
//p1和p2指向同一地址空间,说明只创造出了一个懒汉式对象
Singleton_lazy* p1 = Singleton_lazy::getInstance();
Singleton_lazy* p2 = Singleton_lazy::getInstance();
//p3和p4指向同一地址空间,说明只创造出了一个饿汉式对象
Singleton_hungry* p3 = Singleton_hungry::getInstance();
Singleton_hungry* p4 = Singleton_hungry::getInstance();
return 0;
}