引言:
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 Thread 30 { 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; ERROR 42 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 }
时间: 2024-12-21 17:47:14