单例模式是一种对象创造型模式,使用单列模式可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。
单例模式的设计步骤:
1、构造函数私有化。
2、提供一个全局的静态方法。
3、在类中定义一个静态指针,指向本类变量的静态变量指针。
单例的实现可以分为懒汉式和饿汉式,主要区别在于对象的创建时机的不同。懒汉式是在第一次使用对象时创建对象的,而饿汉式则在程序启动时就将对象创建好,无论是否对象。
#include<iostream> //单列模式——懒汉模式
#include<pthread.h>
using namespace std;
pthread_mutex_t mutex;
class Singleton
{
private:
static Singleton *mInstance;
static int ObjectCount;
private:
Singleton() //构造函数必须申明为私有
{
}
public:
static Singleton *GetInstance() //提供给外部创建对象
{
ObjectCount++;
if(mInstance==NULL)
{
usleep(10000);
mInstance=new Singleton; //在此处申请对象
}
return mInstance;
}
static int GetObjectCount()
{
return ObjectCount;
}
void release() //释放
{
ObjectCount--;
if(ObjectCount==0&&mInstance!=NULL)
{
delete mInstance;
mInstance=NULL;
}
}
};
Singleton *Singleton::mInstance=NULL;
int Singleton::ObjectCount=0;
void *Create(void *arg)
{
pthread_mutex_lock(&mutex); //加锁
Singleton *s = Singleton::GetInstance();
cout << s << endl;
pthread_mutex_unlock(&mutex);
}
int main()
{
/*Singleton *s1 = Singleton::GetInstance();
Singleton *s2 = Singleton::GetInstance();
Singleton *s3 = Singleton::GetInstance();
Singleton *s4 = Singleton::GetInstance();
Singleton *s5 = Singleton::GetInstance();
Singleton *s6 = Singleton::GetInstance();
cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
cout << s4 << endl;
cout << s5 << endl;
cout << s6 << endl;
cout << Singleton::GetObjectCount() << endl;*/
pthread_mutex_init(&mutex,NULL); //多线程时涉及线程同步等问题
int ret;
pthread_t tid[10];
for (int i=0;i<10;i++)
{
ret=pthread_create(&tid[i],NULL,Create,NULL);
if(ret!=0)
{
perror("pthread_create");
}
}
void *status;
for(int i=0;i<10;i++)
{
pthread_join(tid[i],&status);
}
pthread_mutex_destroy(&mutex);
return 0;
}
饿汉模式
#include<iostream> //单列模式——饿汉模式
#include<pthread.h>
using namespace std;
class Singleton
{
private:
static Singleton *mInstance;
static int ObjectCount;
private:
Singleton() //构造函数必须申明为私有
{
}
public:
static Singleton *GetInstance() //提供给外部创建对象
{
ObjectCount++;
return mInstance;
}
static int GetObjectCount()
{
return ObjectCount;
}
void release() //释放
{
ObjectCount--;
if(ObjectCount==0&&mInstance!=NULL)
{
delete mInstance;
mInstance=NULL;
}
}
};
Singleton *Singleton::mInstance=new Singleton; //在初始化时便申请对象,懒汉模式是在构造函数里进行申请对象
int Singleton::ObjectCount=0;
void *Create(void *arg)
{
Singleton *s = Singleton::GetInstance();
cout << s << endl;
}
int main()
{
/*Singleton *s1 = Singleton::GetInstance();
Singleton *s2 = Singleton::GetInstance();
Singleton *s3 = Singleton::GetInstance();
Singleton *s4 = Singleton::GetInstance();
Singleton *s5 = Singleton::GetInstance();
Singleton *s6 = Singleton::GetInstance();
cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
cout << s4 << endl;
cout << s5 << endl;
cout << s6 << endl;
cout << Singleton::GetObjectCount() << endl;*/
//多线程时涉及线程同步等问题,饿汉模式时无影响
int ret;
pthread_t tid[10];
for (int i=0;i<10;i++)
{
ret=pthread_create(&tid[i],NULL,Create,NULL);
if(ret!=0)
{
perror("pthread_create");
}
}
void *status;
for(int i=0;i<10;i++)
{
pthread_join(tid[i],&status);
}
return 0;
}
在一定程度上,饿汉模式优于懒汉模式