c++单例模式
来源:互联网 发布:软件行业的职位 编辑:程序博客网 时间:2024/06/16 12:03
如何实现单例模式:
#include <iostream> using namespace std; //单例类的C++实现 class Singleton { private: Singleton();//注意:构造方法私有 virtual ~Singleton(); static Singleton* instance;//惟一实例 int var;//成员变量(用于测试) public: static Singleton* GetInstance();//工厂方法(用来获得实例) int getVar();//获得var的值 void setVar(int);//设置var的值 }; //构造方法实现 Singleton::Singleton() { this->var = 20; cout<<"Singleton Constructor"<<endl; } /*Singleton::~Singleton() { delete instance; } */Singleton::~Singleton(){ if(instance != NULL) { delete instance; }}//初始化静态成员 //Singleton* Singleton::instance=new Singleton(); Singleton* Singleton::instance=NULL;Singleton* Singleton::GetInstance() { if(instance == NULL) { instance = new Singleton(); } return instance; } //seter && getter含数 int Singleton::getVar() { return this->var; } void Singleton::setVar(int var) { this->var = var; } //main int main(int argc, char* argv[]) { Singleton *ton1 = Singleton::GetInstance(); Singleton *ton2 = Singleton::GetInstance(); cout<<"ton1 var = "<<ton1->getVar()<<endl; ton1->setVar(150); cout<<"ton2 var = "<<ton2->getVar()<<endl; return 0; } 以上的代码,是实现单例模式的一个代码,我实在搞不懂,里面到底哪里体现出单例模式来了?
=====为什么叫单例模式======
1、构造方法私有 那么,就意味着,只能在Singleton的成员函数中,才能调用Singleton的构造函数来创建实例。在Singleton之外,不能创建Singleton对象的实例。2、代码中,定义了GetInstance方法,只能通过GetInstance方法来获取Singleton对象的实例,单例就是在GetInstance方法中控制的。首先,Singleton有一个static Singleton* instance;//惟一实例 Singleton* Singleton::instance=NULL;在这里初始化为NULL。Singleton* Singleton::GetInstance() { if(instance == NULL) { instance = new Singleton(); } return instance; } 上面的函数,就是通过instance来实现单例的。当第一次调用GetInstance时,instance 为NULL,所以会执行instance = new Singleton();把这个新建的实例保存到静态成员instance,并返回这个指针。第二次到第N次调用GetInstance时,由于instance不为空,所以会直接返回instance 。也就是第一次调用GetInstance创建的那个实例。所以这样就实现了,单实例。思就是说,Singleton对象的实例,只会被创建一次,就是说内存中,只存在一个Singleton的实例,就是所谓,单实例。==========销毁=========C++中的单例模式 单例模式很有用,使用单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。但是在程序的开发过程中我们总是遇到一些问题,而这些问题主要集中在单例类的消毁过程中,普通使用的单例模式的类如下:class Singleton:{ // 其它成员public: static Singleton * GetInstance() { if (m_pInstance == NULL) m_pInstance = new Singleton(); return m_pInstance; } private: Singleton(){}; static Singleton * m_pInstance;}可是这个类在什么时候调用它的析构函数呢,我们怎么消毁它。提供一个公用的destroy函数来进行它的消毁吗,这很不美观。最后我就在网上找到了如果下的代码处理了这个问题:class Singleton:{ // 其它成员public: static Singleton * GetInstance(){...}private: Singleton(){}; static Singleton * m_pInstance; class CGarbo // 它的唯一工作就是在析构函数中删除Singleton的实例 { public: ~CGarbo(){ if (Singleton::m_pInstance) delete Singleton::m_pInstance; } }; static CGarbo Garbo; // 定义一个静态成员,在程序结束时,系统会调用它的析构函数}这是非常好的方法,静态成员对象 Garbo 在析构时会自动的消毁单例,我们不用再担心这个问题了。但是添加一个类的静态对象,总是让人不太满意,所以有人用如下方法来重现实现单例和解决它相应的问题,代码如下:class Singleton:{ // 其它成员public: static Singleton &GetInstance(){ static Singleton instance; return instance; } private: Singleton(){};}使用局部静态变量,非常强大的方法,完全实现了单例的特性,而且代码量更少,也不用担心单例消毁的问题。在后期的项目中我全使用了这种方法,可是在项目的开发过程中还是出现了问题,当如下方法使用单例时问题来了,Singleton singletion = Singleto::GetInstance();这么做就产生了一个类拷贝的问题,这就为背了单例的特性。产生这个问题的原因在于,编译器会为类生成一个默认的构造函数,来支持类的拷贝。最后没有办法,我们要禁止类拷贝和类赋值,禁止程序员用这种方式来使用单例,当时领导的意思是GetInstance()函数返回一个指针而不是返回一个引用,函数代码改为如下: static Singleton *GetInstance(){ static Singleton instance; return &instance; }可我总是感觉不好,为什么不让编译器不这么干呢。这时我才想起可以显式的声明类拷贝的构造函数,和重载=操作符,新的单例类如下:class Singleton:{ // 其它成员public: static Singleton &GetInstance(){ static Singleton instance; return instance; } private: Singleton(){}; Singleton(const Singleton&); Singleton & operate = (const Singleton&);}关于Singleton(const Singleton&);和Singleton & operate = (const Singleton&);函数,我们要声明成私用的,并且只声明不实现。这样子后如果用上面的方式来使用单例时,不管是在友元类中还是其它的,编译器都是报错。不知道这样的单例类是否还会有问题,但在程序中这样子使用已经基本没有问题了。
- C#单例模式
- C#-单例模式
- 单例模式(C++)
- 【C++】单例模式
- [C++]单例模式
- 单例模式(C++)
- C ++的单例模式
- 【C++】Chapter17:单例模式
- Object-c单例模式
- Objectove-c单例模式
- Objective C--单例模式
- Objective C--单例模式
- Objective C 单例模式
- Objective C--单例模式
- 单例模式(C#)
- 单例模式(C#)
- object-c 单例模式
- c++-单例模式Singleton
- 012 查找整数数组中第二大的数
- AKM8975C源代码
- 冷暖自知 who knew:伤感日志
- hdu - 4419 - Colourful Rectangle - 线段树
- debian6上安装java7.txt
- c++单例模式
- 离线安装SDK
- 如何不继承TabActivity实现tabhost布局
- 表数据和索引数据分开独立表空间存储优点
- android ics SystemUI详解
- 大型互联网站解决海量数据的常见策略
- 2010-12-23 20:09 使用jquery获取iframe加载完成事件
- const和static readonly区别
- 浮华沧桑的伤感完美日志发布:有伤痕,才算完美