一个类只生成唯一的实例对象。
实现步骤:
1)构造函数私有化
2)提供一个全局的静态方法(全局访问点)
3)在类中定义一个静态指针,指向本类的变量的静态变量指针
懒汉式:
#include<iostream>
using namespace std;
#define NULL 0
// 单例模式---懒汉式
class singelTon {
private:
singelTon() {
cout << "构造函数" << endl;
}
static singelTon* sgl_ptr;
public:
static singelTon* get_instance(){
if (sgl_ptr == NULL) {
sgl_ptr = new singelTon();
}
return sgl_ptr;
}
static void free_instance() {
delete sgl_ptr;
sgl_ptr = NULL;
cout << "对象释放成功!" << endl;
}
};
singelTon* singelTon::sgl_ptr = NULL;
void main() {
singelTon* ptr1 = singelTon::get_instance();
singelTon* ptr2 = singelTon::get_instance();
if (ptr1 == ptr2) {
cout << "同一个对象!" << endl;
}
else {
cout << "不是同一个对象!" << endl;
}
singelTon::free_instance();
system("pause");
}
#include<iostream>
using namespace std;
#define NULL 0
// 单例模式---饿汉式
class singelTon {
private:
singelTon() {
cout << "构造函数" << endl;
}
static singelTon* sgl_ptr;
public:
static singelTon* get_instance(){
return sgl_ptr;
}
static void free_instance() {
delete sgl_ptr;
sgl_ptr = NULL;
cout << "对象释放成功!" << endl;
}
};
singelTon* singelTon::sgl_ptr = new singelTon();
void main() {
singelTon* ptr1 = singelTon::get_instance();
singelTon* ptr2 = singelTon::get_instance();
if (ptr1 == ptr2) {
cout << "同一个对象!" << endl;
}
else {
cout << "不是同一个对象!" << endl;
}
singelTon::free_instance();
system("pause");
}
懒汉式-多线程不同步的问题:运用二次检查+临界区上锁
static CCriticalsection cs; //临界区
class singelTon {
private:
singelTon() {
cout << "构造函数" << endl;
}
static singelTon* sgl_ptr;
public:
static singelTon* get_instance() {
if (sgl_ptr == NULL) {
cs.Lock();
if (sgl_ptr == NULL) {
sgl_ptr = new singelTon();
}
cs.Unlock();
}
return sgl_ptr;
}
static void free_instance() {
delete sgl_ptr;
sgl_ptr = NULL;
cout << "对象释放成功!" << endl;
}
};
singelTon* singelTon::sgl_ptr = NULL;