C++之单例模式

1、C++单例模式的概念及作用

单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。

2、单例模式的实现原理

(1)私有静态指针变量实现:使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法获取该实例。
(2)静态局部变量实现:在公有静方法中定义指向该类的一个静态局部变量,并返回该静态局部变量。
3、单例模式的实现代码
(1)
//私有静态指针变量实现



class
Singleton { private: Singleton() //构造函数是私有的 { } static Singleton *pInstance; public: static Singleton * GetInstance() { if(pInstance == NULL) //判断是否第一次调用 pInstance = new Singleton(); return pInstance; } };

(2)

//静态局部变量


class
Singleton { private: Singleton() //构造函数是私有的 { } public: static Singleton & GetInstance() { static Singleton instance; //局部静态变量 return &instance; } };

4、扩展

a)      把构造函数设为私有,禁用赋值和复制。带来的问题:main中无法随意生成对象

b)     提供一个static函数绕过构造函数为private的限制。问题:对象不唯一。

c)      设置一个static指针,每次先判断是否为NULL。此时实现了一个简单的单例模式。但是此时在多线程环境下不唯一。

d)     引入互斥锁,实现对getInstance内临界区的互斥访问。此时每次调用都需要上锁,导致效率下降。

e)      采用double check模式,使得不必每次调用都需要加锁,提高了效率。

5、DCLP(double-check-locking-pattern)

class Singleton
{
public:
    static Singleton *getInstance()
    {
        if(pInstance_ == NULL)
        {
            mutex_.lock();
            if(pInstance_ == NULL) //线程的切换
                pInstance_ = new Singleton;
            mutex_.unlock();
        }
        
        return pInstance_;
    }
private:
    Singleton() { }

    static Singleton *pInstance_;
    static MutexLock mutex_;
};

 

 
 
 

 

posted @ 2014-10-10 00:58  worseman  阅读(277)  评论(0编辑  收藏  举报