一、懒汉模式
具体例子如下:
/**
* 懒汉式单例模式
*/
#include <iostream>
using namespace std;
/* 定义Singleton类,用来表示单例模式 */
class Singleton
{
public:
static Singleton *getInstance();
private:
Singleton();
Singleton(const Singleton &other);
Singleton &operator=(const Singleton &other);
static Singleton *instance;
};
/* 实现Singleton类中的方法和静态数据成员 */
Singleton *Singleton::getInstance()
{
return instance;
}
Singleton::Singleton(){cout << "Singleton()" << endl;}
Singleton::Singleton(const Singleton &other){cout << "Singleton(const Singleton &other)" << endl;}
Singleton &Singleton::operator=(const Singleton &other){cout << "Singleton &operator=(const Singleton &other)" << endl;}
Singleton *Singleton::instance = new Singleton();
/* 程序入口 */
int main()
{
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
Singleton* s3 = Singleton::getInstance();
cout << "s1 address is " << s1 << endl;
cout << "s2 address is " << s2 << endl;
cout << "s3 address is " << s3 << endl;
return 0;
}
注意有内存泄漏。
二、饿汉模式
具体实现如下:
/**
* 饿汉式单例模式
*/
#include <iostream>
#include <pthread.h>
using namespace std;
/* 定义Singleton类,用来表示单例模式 */
class Singleton
{
public:
static Singleton *getInstance();
private:
Singleton();
Singleton(const Singleton &other);
Singleton &operator=(const Singleton &other);
static Singleton *instance;
static pthread_mutex_t mutex;
/* 定义一个内嵌类用于清除Singleton实例 */
class DestroySingleton
{
public:
~DestroySingleton();
};
static DestroySingleton destroyInstance;
};
/* 实现Singleton类中的方法和静态数据成员 */
Singleton *Singleton::getInstance()
{
if(NULL == instance)
{
pthread_mutex_lock(&mutex); /* 上锁 */
if(NULL == instance)
{
instance = new Singleton();
}
pthread_mutex_unlock(&mutex); /* 解锁 */
}
return instance;
}
Singleton::Singleton(){cout << "Singleton()" << endl;}
Singleton::Singleton(const Singleton &other){cout << "Singleton(const Singleton &other)" << endl;}
Singleton &Singleton::operator=(const Singleton &other){cout << "Singleton &operator=(const Singleton &other)" << endl;}
Singleton *Singleton::instance = NULL;
pthread_mutex_t Singleton::mutex = PTHREAD_MUTEX_INITIALIZER;
Singleton::DestroySingleton Singleton::destroyInstance;
/* 实现内部类DestroySingleton的析构函数 */
Singleton::DestroySingleton::~DestroySingleton()
{
if(NULL != Singleton::instance)
{
delete Singleton::instance;
Singleton::instance = NULL; /* 防止野指针 */
cout << "~DestroySingleton()" << endl;
}
}
/* 程序入口 */
int main()
{
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
Singleton* s3 = Singleton::getInstance();
cout << "s1 address is " << s1 << endl;
cout << "s2 address is " << s2 << endl;
cout << "s3 address is " << s3 << endl;
return 0;
}
注意多线程的同步问题,加锁与解锁。