一、单例模式
- 单例模式分为两种:饿汉模式与懒汉模式
1.1 懒汉:在第一次用到类实例的时候才会去实例化。
1.2 饿汉:在类定义的时候就去实例化。 - 单例模式的关键点
2.1 私有构造函数(也要私有拷贝构造函数,赋值函数,例程见1.1)
2.2 声明单例对象为静态
2.3 通过静态方法来构造函数(返回静态指针)
2.4 判断单例对象是否已存在
2.5 加线程锁 - C++实现
3.1 懒汉模式
class singleton
{
private:
singleton(){}; //私有构造函数,拷贝函数等略
static singleton *p; //声明单例对象为静态
public:
static singleton* instance(); //通过静态方法来构造函数
static pthread_mutex_t mutex; //建立一个锁空间
}
singleton* singleton::p = NULL;
singleton* singleton::instance()
{
pthread_mutex_init(&mutex);
if (p == NULL)
{
pthread_mutex_lock(&mutex);
if (p == NULL) //二次判断
p = new singleton();
pthread_mutex_unlock(&mutex);
}
return p;
}
3.2 饿汉模式
class singleton
{
protected:
singleton(){};
private:
static singleton* p;
public:
static singleton* instance();
};
singleton* singleton::p = new singleton;
singleton* singleton::instance()
{
return p;
}
好的博客:
http://blog.jobbole.com/109449/
https://www.cnblogs.com/qiaoconglovelife/p/5851163.html
https://blog.csdn.net/u011344601/article/details/50817944
未私有拷贝构造函数的例程:
class singleton
{
public:
static singleton* instance();
void print()
{
std::cout << count << std::endl;
}
int count = 0;
private:
static singleton* p;
singleton() {
std::cout << "create"<<std::endl;
};
};
singleton* singleton::p = nullptr;
singleton* singleton::instance()
{
if (p == nullptr)
p = new singleton();
return p;
}
int main()
{
singleton* cur = singleton::instance();
cout << &cur<<endl;
singleton* cur1 = singleton::instance();
cout << &cur1 << endl;
cur1->count++;
cout << cur1->count<<endl;
singleton cur2(*cur);
cout << cur2.count << endl;
cur2.count++;
cout << cur1->count << endl;
cout << cur->count << endl;
cout << cur2.count << endl;
//从结果可以看出,cur 与 cur1为同一实例,cur2并不是。
}