首页 > 代码库 > C++之单例模式

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_;};

 

 
 
 

 

C++之单例模式