首页 > 代码库 > C++学习之路: 单例模板

C++学习之路: 单例模板

引言:

1.单例模式的目的:确保一个类只有一个实例,并提供对该实例的全局访问。

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

单例模式 如何实现只有一个实例?? 禁用拷贝构造函数,防止拷贝。

那么还可以通过显式定义来 定义多个实例。

如  NonCopyable a, b; 虽然禁止拷贝,但是可以定义多个对象。

所以我们把构造函数也设为私有,这样就不能通过显式定义多个对象了。

 

那么如果把构造函数设为私有, 该如何实例化这个类呢? 我们之前不是学过 如果把构造函数设为私有, 这个便不可使用,那么不就没有意义了吗?

该如何解决这个问题呢?  采用曲线救国的方式:在类内部定义一个static 全局函数, 让它来替我们调用构造函数, 因为该函数在类的内部, 所以可以访问私有的 构造函数。

1. 如何构造不可复制的类。

 1 #include <iostream> 2 #include "Thread.h" 3 #include <stdlib.h> 4 using namespace std; 5  6 //多线程下具有隐患 7 class Singleton 8 { 9 public:10     static Singleton *getInstance()11     {12         if(pInstance_ == NULL) //线程的切换13         {14             ::sleep(1);15             pInstance_ = new Singleton;16         }17             18         return pInstance_;19     }20 private:21     Singleton() { }22 23     static Singleton *pInstance_; //静态成员可以再外部直接调用24 };25 26 Singleton *Singleton::pInstance_ = NULL;27 28 29 class TestThread : public Thread30 {31 public:32     void run()33     {34         cout << Singleton::getInstance() << endl;35         cout << Singleton::getInstance() << endl;36     }37 };38 39 int main(int argc, char const *argv[])40 {41     //Singleton s; ERROR42 43 44     //测试证明了多线程下本代码存在竞争问题45 46     TestThread threads[12];47     for(int ix = 0; ix != 12; ++ix)48     {49         threads[ix].start();50     }51 52     for(int ix = 0; ix != 12; ++ix)53     {54         threads[ix].join();55     }56     return 0;57 }

 

C++学习之路: 单例模板