单例模式的写法和应用

来源:互联网 发布:2016中国汽车销售数据 编辑:程序博客网 时间:2024/05/03 10:26

众多设计模式中,单例模式比较常见的一种,面试和工作中也会经常接触到。本文以一个C++开发者的角度来探讨单例模式几种典型实现。设计模式经典GoF定义的单例模式需要满足以下两个条件:

1.   保证一个类只创建一个实例。

2.   提供对该实例的全局访问点。

如果系统有类似的实体(有且只有一个,且需要全局访问),那么就可以将其实现为一个单例。实际工作中常见的应用举例

  • 日志类,一个应用往往只对应一个日志实例。
  • 配置类,应用的配置集中管理,并提供全局访问。
  • 管理器,比如windows系统的任务管理器就是一个例子,总是只有一个管理器的实例。
  • 共享资源类,加载资源需要较长时间,使用单例可以避免重复加载资源,并被多个地方共享访问。

 

 

class Singleton

{

public:

       staticSingleton& GetInstance()

       {

              if(NULL== m_pInstance)

              {

                     Locklock;//基于作用域的 加锁,超出作用域,自动调用析构函数解锁

                     if(NULL== m_pInstance)

                     {

                            m_pInstance= new Singleton;

                     }                   

              }

 

              return*m_pInstance;

       }

private:

       Singleton();

       ~Singleton();

       Singleton(constSingleton&);

       Singleton&operator = (const Singleton&);

 

 

private:

       staticSingleton* m_pInstance;

};

 

Lazy Singleton的一种线程安全改造是在Instance()中每次判断是否为NULL前加锁,但是加锁是很慢的。 
而实际上只有第一次实例创建的时候才需要加锁。双检测锁模式被提出来,改造之后大致是这样

既然只需要在第一次初始化的时候加锁,那么在这之前判断一下实例有没有被创建就可以了,所以多在加锁之前多加一层判断,需要判断两次所有叫Double-Checked

 

0 0