C++ 单例模式解析

单例模式定义

该类负责建立本身的对象,同时确保只有单个对象被建立。这个类提供了一种访问其惟一的对象的方式,能够直接访问,不须要实例化该类的对象。c++

在C++中,我我的的理解是,不须要本身new类指针,这样一方面也方便程序员本身管理内存,另外一方面能够节省系统指针,减小占用内存资源。程序员

单例模式的实现要求

简单的来讲,就是一个类要有惟一的单例,并且这个单例类可以被其余对象所调用,不能用,那就没意义了嘛 。bash

单例模式的代码实现

前面两个定义和实现要求理解以后,让咱们来看看单例模式是如何在C++中被巧妙地利用。函数

首先看一下使用单例模式的类测试

头文件单例类的定义以下:ui

//单例模式类
class Singleton {
public:
	Singleton();
	~Singleton();
	void walk();

	static Singleton * getSingleton(); //返回单例指针
private:
	static Singleton * m_Instance;//单例全局指针

	//程序结束时释放静态成员
	class CGararge // 它的惟一工做就是在析构函数中删除CSingleton的实例 {  
	public:  
		~CGararge()  
		{  
			//这边清空单例指针 回收内存
			if (Singleton::m_Instance)  
				delete Singleton::m_Instance;  
		}  
	 };   
	static CGararge Garbo; // 定义一个静态成员,在程序结束时,系统会调用它的析构函数 
};
复制代码

其中定义了单例成员指针m_Instance或获取单例指针的方式spa

还定义了类CGarbage 用于释放单例指针指针

接下来是实现cpp文件code

Singleton::Singleton()
{
}

Singleton* Singleton::m_Instance = nullptr;

Singleton::~Singleton()
{
	cout << "被析构了" << endl;
}

void Singleton::walk()
{
	cout << " I AM WALKING ALONE" << endl;
}

Singleton* Singleton::getSingleton()
{
	//若是没被实例化 就先new一个
	if(m_Instance==nullptr)
	{
		m_Instance = new Singleton();
	}
	return m_Instance;
}
复制代码

这里面很容易看出来 getSingleton()函数用来new单例指针 判断是否单例指针存在,这样的好处 是能够保证整个类的全局指针 只占用一个内存地址,无需每次都要newcdn

接下来看一下测试代码

Singleton * cur_Instance = Singleton::getSingleton();
	cur_Instance->walk();
	cout << "旧的地址" << cur_Instance << endl;
	Singleton * cur_NextInstance = cur_Instance->getSingleton();
	cur_NextInstance->walk();
	cout << "新的地址"<< cur_NextInstance << endl;
	int mm ;
	cin >> mm;
复制代码

运行程序 :

能够明显的看出,只产生了一个实例指针,这样很方便咱们去管理内存,也不占用内存资源

接下来看一下不用单例模式的常规类会有什么不同

头文件

class People {
public:
	void walk();
};
复制代码

定义了一我的的类 里面一个walk方法

实现

void People::walk()
{
	cout << " I AM WALKING ALONE" << endl;
}

复制代码

很简单 和上面同样

接下来看一下测试代码

People *p_people = new People();
	p_people->walk();
	People *p_nextPeople = new People();
	p_nextPeople->walk();
	cout << "旧地址" << p_people << endl; 
    cout << "新地址" <<  p_nextPeople << endl; 

	delete p_people;
	delete p_nextPeople;
复制代码

测试代码也很简单

new了两个指针 而后执行walk函数 最后看一下地址 而后释放内存

看一下运行结果:

能够明显看出 这个产生了两个内存,若是在大型项目当中 须要在不一样的文件当中引用类,很明显,对于程序自己占用内存 是个负担,并且 很容易形成内存泄漏的现象,因此单例模式的优点也显而易见,能够尽量占用少的内存,而且及其易于管理内存,但愿借着两个例子,可以给你们带来一点启发。

相关文章
相关标签/搜索