您的位置:首页 > 编程语言 > C语言/C++

c++单例模式初探

2015-10-05 13:43 274 查看
在cocos2d-x中看到了大量的单例模式,于是学习了一下c++的单例模式。
单例模式是什么?
只能产生一个实例的类就是单例模式。我们设计一个类,有时只需要使用它一次,比如一台电脑只能有一个显示器,日志的输出,窗口只能有一个,于是我们通过单例模式来实现它,而非全局变量,因为全局变量会影响封装性,不能保证程序不会修改它。

c++单例模式如何实现?
实现单例模式要注意以下几点:
1.私有化构造函数,提供公有getInstance()方法访问单例。
2.利用程序在结束的时候,系统会自动析构所有全局变量(包括静态变量),我们创建一个静态成员变量,它的唯一作用就是在结束时析构单例。
以下是实现代码:

class CSingleton

{

private:

CSingleton()

{

}

static CSingleton *m_pInstance;

class CGarbo //它的唯一工作就是在析构函数中删除CSingleton的实例

{

public:

~CGarbo()

{

if(CSingleton::m_pInstance)

delete CSingleton::m_pInstance;

}

};

static CGarbo Garbo; //定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数

public:

static CSingleton * GetInstance()

{

if(m_pInstance == NULL) //判断是否第一次调用

m_pInstance = new CSingleton();

return m_pInstance;

}

};

但是这样做代码量太大,不令人满意,于是有人又通过局部静态变量,实现如下:

class CSingleton

{

private:

CSingleton() //构造函数是私有的

{

}

CSingleton(const CSingleton &);

CSingleton & operator = (const CSingleton &);

public:

static CSingleton & GetInstance()

{

static CSingleton instance; //局部静态变量

return instance;

}

};

拷贝构造函数和赋值运算符的重载只声明不实现,是为了应对类拷贝的问题,这样使用类拷贝的时候系统会报错(私有)。

单例模式的优缺点?
优点:简单易用,一个全局变量可以与很多对象交互,降低创建多个对象引起的内存管理风险。
缺点:单例模式提供的全局访问点是很危险的(原因参考设计模式),一般在程序结束前内存都得不到释放。所以必须慎用单例。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: