码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-10-09 22:33:17      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   使用   ar   for   sp   

引言:

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 }

 

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

标签:style   blog   color   io   os   使用   ar   for   sp   

原文地址:http://www.cnblogs.com/DLzhang/p/4014389.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!