【那些年遇到过的面试题】单例和静态类

来源:互联网 发布:触碰心灵的话 知乎 编辑:程序博客网 时间:2024/05/18 00:43

单例模式只产生一个实例,适用于线程安全的工厂模式

静态类方法是在加载类的时候会用到的方法,无需new一个对象


如果类中只有方法没有属性,静态类合适

如果类中既有方法又有方法,且方法可以修改,则用单例


首先,单例可以继承类,实现接口,而静态类不能(可以集成类,但不能集成实例成员);

其次,单例可以被延迟初始化,静态类一般在第一次加载是初始化;

再次,单例类可以被集成,他的方法可以被覆写;

最后,单例类可以被用于多态而无需强迫用户只假定唯一的实例。


单例模式的资源释放:

class CSingleton
{
//其他成员
public:
static CSingleton* GetInstance();
private:
    CSingleton(){};
    static CSingleton * m_pInstance;
class CGarbo //它的唯一工作就是在析构函数中删除CSingleton的实例
{
        public:
            ~CGarbo()
            {
                if( CSingleton::m_pInstance )
                  delete CSingleton::m_pInstance;
           }
 }

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

类CGarbo被定义为CSingleton的私有内嵌类,以防该类被在其他地方滥用。

程序运行结束时,系统会调用CSingleton的静态成员Garbo的析构函数,该析构函数会删除单例的唯一实例。

注意了,在代码部分

静态成员定义(cpp文件):
CSingleton* CSingleton::m_pInstance = NULL;
CSingleton::CGarbo CSingleton::Garbo;   //这个很重要


单例模式实现(线程安全,这样答比较):

class Singleton
  {
  private:
      static Singleton* m_instance;
      Singleton(){}
  public:
      static Singleton* getInstance();
  };
 
 Singleton* Singleton::getInstance()
 {
     if(NULL == m_instance)
     {
         Lock();//借用其它类来实现,如boost
         if(NULL == m_instance)
         {
             m_instance = new Singleton;
         }
         UnLock();
     }
     return m_instance;
 }


0 0