该类负责建立本身的对象,同时确保只有单个对象被建立。这个类提供了一种访问其惟一的对象的方式,能够直接访问,不须要实例化该类的对象。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函数 最后看一下地址 而后释放内存
看一下运行结果:
能够明显看出 这个产生了两个内存,若是在大型项目当中 须要在不一样的文件当中引用类,很明显,对于程序自己占用内存 是个负担,并且 很容易形成内存泄漏的现象,因此单例模式的优点也显而易见,能够尽量占用少的内存,而且及其易于管理内存,但愿借着两个例子,可以给你们带来一点启发。