深入理解单例模式

1、介绍:
是软件开发过程中面临的一般问题的解决方案,也就是一套被反复使用,经过分类,代码设计总结出来的经验.
2、特点:
(1)保证全局只有一个唯一的实例对象
(2)单例类提供获取这个唯一获取实例的接口
3、分类:分为饿汉模式和懒汉模式
4、代码实现:
class Singleton  //懒汉模式
{
public:
    static Singleton *GetInstance()
    {
        if (m_Instance == NULL )
        {
            Lock(); // C++没有直接的Lock操作,请使用其它库的Lock,比如Boost,此处仅为了说明
            if (m_Instance == NULL )
            {
                m_Instance = new Singleton ();
            }
            UnLock(); // C++没有直接的Lock操作,请使用其它库的Lock,比如Boost,此处仅为了说明
        }
        return m_Instance;
    }
/*次处进行了两次m_Instance == NULL的判断,是借鉴了Java的单例模式实现时,使用的所谓的“双检锁”机制。因为进行一次加锁和解锁是需要付出对应的代价的,而进行两次判断,就可以避免多次加锁与解锁操作,同时也保证了线程安全。但是,这种实现方法在平时的项目开发中用的很好,也没有什么问题?但是,如果进行大数据的操作,加锁操作将成为一个性能的瓶颈;为此,一种新的单例模式的实现也就出现了。*/
    static void DestoryInstance()//  way 1
    {
        if (m_Instance != NULL )
        {
            delete m_Instance;
            m_Instance = NULL ;
        }
    }
    //在类外手动调用DestoryInstance()函数释放资源,容易忘记,所以就有了以下的释放方法
class Destroy           //way 2
    {
       public:
           ~Destroy()
           {
               if (instance)
               {
                   delete instance;
                   instance = NULL;
               }
           }
    };
Private:
    Singleton(){}
    Singleton(constSingleton&)  {}
    Singleton operator=(const Singleton&){} 
private:
    static Singleton *m_Instance;
};
Singleton *Singleton ::m_Instance = NULL;
// way 2释放时
    /*在程序运行结束时,系统会调用Singleton的静态成员Destroy的析构函数,
    该析构函数会进行资源的释放,而这种资源的释放方式是在程序员“不知道”
    的情况下进行的,而程序员不用特别的去关心,使用单例模式的代码时,不必关心资源的释放。
    那么这种实现方式的原理是什么呢?由于程序在结束的时候,系统会自动析构所有的全局变量,
    实际上,系统也会析构所有类的静态成员变量,就像这些静态变量是全局变量一样。我们知道,
    静态变量和全局变量在内存中,都是存储在静态存储区的,所以在析构时,是同等对待的。
    那我先从实际的项目中说起吧,在实际项目中,特别是客户端开发,其实是不在乎这个实例的销毁的。
    因为,全局就这么一个变量,全局都要用,它的生命周期伴随着软件的生命周期,软件结束了,
    它也就自然而然的结束了,因为一个程序关闭之后,它会释放它占用的内存资源的,所以,
    也就没有所谓的内存泄漏了。但是,有以下情况,是必须需要进行实例销毁的:在类中,有一些文件锁了,
    文件句柄,数据库连接等等,这些随着程序的关闭而不会立即关闭的资源,必须要在程序关闭前,进行手动释放;
*/

class Singleton  //饿汉模式 
{
public:
static Singleton* Getinstance()
{
  static  Singleton instance;
  return &instance; //注意返回值是引用
}
privateSingleton(){}
    Singleton(constSingleton&)  {}
    Singleton operator=(const Singleton&){} 
private:
      static Singleton *instance;
};
Singleton Singleton::instance=NULL;

//释放资源和上面的懒汉模式方法一样,这里就不在赘述了。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值