单例模式简介:
单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点,通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
为什么要用单例?
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
而单例模式是让类自身负责保存它的唯一实例,这个类保证没有其他实例被创建,也就是说一个类只能有一个实例,然后它提供给系统一个可以访问该实例的接口,我们可以使用该接口来根据项目需要创建自己要定义的单实例。
单例模式实现的基本要素:
1.类定义中含有一个该类的静态私有对象
2.提供一个访问点给外部访问
3.具有私有的构造函数
Singleton.h
#include <iostream>
using namespace std;
class Singleton
{
private:
Singleton();
public:
static Singleton *m_pInstance;
static Singleton *GetInstance();
}
Singleton.cpp
Singleton *Singleton::m_pInstance=NULL;
Singleton *Singleton::GetInstance()
{
if(m_pInstance==NULL)
{
m_pInstance =new Singleton();
}
return m_pInstance;
}
有了这样的单实例,我们便可以在是用该函数接口来创建单例对象。网上看了下有人说对单例对象的销毁,贴下代码 大家也了解下
程序在结束的时候,系统会自动析构所有的全局变量。事实上,系统也会析构所有的类的静态成员变量,就像这些静态成员也是全局变量一样。利用这个特征,我们可以在单例类中定义一个这样的静态成员变量,而它的唯一工作就是在析构函数中删除单例类的实例。
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;
}
};
使用这种方法释放单例对象有以下特征:
在单例类内部定义专有的嵌套类;
在单例类内定义私有的专门用于释放的静态成员;
利用程序在结束时析构全局变量的特性,选择最终的释放时机;
使用单例的代码不需要任何操作,不必关心对象的释放。