首页 > 代码库 > 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++学习之路: 单例模板
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。