单例模式的C++简单实现

来源:互联网 发布:amd优化游戏 编辑:程序博客网 时间:2024/05/29 12:48

一、懒汉模式

具体例子如下:

/**  *懒汉式单例模式  */#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;}
注意多线程的同步问题,加锁与解锁。

原创粉丝点击