单例模式:一个类只能创建一个对象。
为什么使用单例模式?
在多个线程之间,初始化一次socket资源,对资源进行共享。
- 构造函数私有化
- 提供一个全局的静态方法
- 在类中定义一个静态指针,指向本类的变量的静态指针变量!!!
代码实现:
#include<iostream>
using namespace std;
class Singelton{
private:
Singelton(){
cout<<"Singelton 构造函数执行"<<endl;
}
public:
static Singelton *getInstance(){
if(m_psl == NULL){
m_psl = new Singelton; //申请了一个对象的入口地址;
}
return m_psl;
}
static void freeInstance(){
if(m_psl){
cout<<"释放对象空间"<<endl;
delete m_psl;
m_psl = NULL;
}
}
private:
static Singelton *m_psl; //静态变量,必须在类外进行初始化,此时才会分配内存空间!!!
};
Singelton *Singelton::m_psl = NULL;
int main(void){
Singelton *p1 = Singelton::getInstance();
Singelton *p2 = Singelton::getInstance();
if(p1 == p2){
cout<<"是同一个对象"<<endl;
}else{
cout<<"不是同一个对象"<<endl;
}
Singelton::freeInstance();
return 0;
}
运行结果:
- 懒汉式:只有在调用相应的方法时,才会构造对象!!!
- 缺点:每次都要进行判断,程序进行慢!
-
懒汉式遇上多线程,此时就不能保证是单例模式了,可能会创建多个对象,解决方案:同步加锁、解锁机制!
-
构造函数不是线程安全函数!--->进行线程同步,保证只有一个线程去调用构造函数.其它的线程都要等待,才能保证只构造一个对象!
代码实现:
#include<iostream>
using namespace std;
class Singelton{
private:
Singelton(){
cout<<"Singelton 构造函数执行"<<endl;
}
public:
static Singelton *getInstance(){
return m_psl;
}
static void freeInstance(){
if(m_psl){
cout<<"释放对象空间"<<endl;
delete m_psl;
m_psl = NULL;
}
}
private:
static Singelton *m_psl; //此时C++编译器并没有分配内存!!!
};
Singelton *Singelton::m_psl = new Singelton;
int main(void){
cout<<"*********************"<<endl; //执行顺序:先执行静态变量的初始化(此时也就是构造函数),在执>
行主函数中的代码!!!
Singelton *p1 = Singelton::getInstance();
Singelton *p2 = Singelton::getInstance();
if(p1 == p2){
cout<<"是同一个对象"<<endl;
}else{
cout<<"不是同一个对象"<<endl;
}
Singelton::freeInstance();
return 0;
}
运行结果:
饿汉式:
- 饿汉式:不管需不需要对象空间,都先提前布局好对象空间;
- 缺点:可能存在内存空间的浪费!
还有个懒汉式多线程的代码没有实现,那是解决单例中同步问题的方法。
原创文章链接:C++进阶系列之设计模式(2)---单例模式