本文共 1337 字,大约阅读时间需要 4 分钟。
原文地址:
Singleton模式: Singleton模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。比如读取并保存配置文件的类就只应该有一个实例。
Singleton模式典型的结构图如下:
Singleton模式比较简单,也很容易理解。所以不做太多解释,上源码,两种方式的实现代码:
//Singleton.h#ifndef _SINGLETON_H_#define _SINGLETON_H_// 单例模式实现方法1class Singleton{public: static Singleton* GetInstance();protected:private: Singleton(); static Singleton* _instance; // CDestory唯一的工作就是在析构函数中删除Singleton的实例 class CDestory { public: ~CDestory() { delete Singleton::GetInstance(); }; }; static CDestory destory; // 定义一个静态成员,在程序结束时,系统会调用它的析构函数 };// 单例模式实现方法2// 此方法比较简洁,并且不用关心单例指针的释放问题class SingletonEx{public: static SingletonEx* GetInstance() { static SingletonEx _instance; return &_instance; }private: SingletonEx& operator=(const SingletonEx& other); SingletonEx() { }; SingletonEx(const SingletonEx&);};#endif //~_SINGLETON_H_//Singleton.cpp#include "Singleton.h"#includeusing namespace std;Singleton* Singleton::_instance = 0;Singleton::Singleton(){ cout<<"Singleton...."< using namespace std;#include int main(int argc,char* argv[]){ Singleton* sgn = Singleton::GetInstance(); Singleton* sgn1 = Singleton::GetInstance(); _ASSERT(sgn==sgn1); // 证明两个指针地址相同,是同一个对象的地址 SingletonEx* sgnex = SingletonEx::GetInstance(); SingletonEx* sgnex1 = SingletonEx::GetInstance(); _ASSERT(sgnex==sgnex1); // 证明两个指针地址相同,是同一个对象的地址 return 0;}