首页 > 代码库 > 单例模式

单例模式

单例模式

1、单例模式(Singleton pattern)是常见的设计模式中的一种,保证在整个程序中该类只有一个实例。

 

2、单例模式C++实现:

 1 class CSingleton() 2 { 3 public: 4     static CSingleton* GetInstance() 5     { 6         static CSingleton* m_pInstance; 7         if(m_pInstance == NULL)   //判断是否是第一次生成 8         { 9             m_pInstance = new CSingleton;10         }11         return m_pInstance;12     }13     14 private:15     CSingleton() {}    //将构造函数声明为私有成员16 }

3、单例模式解析:
• 为了保证在其他地方对象不会被生成,将构造函数声明为私有成员,这样当在其他地方生成该类的对象时,由于外部无法访问构造函数而生成失败,编译器报错;
• 我们来仔细分析一下GetInstance()函数的细节。该函数定义放回值为CSingleton的指针,在该类中定义局部静态变量m_pInstance为CSingleton的指针变量。根据C++primer第五版279页不完全类型的定义表明可以在类的内部声明指向类本身的指针或引用,但是不能定义。在结合primer271页关于静态成员能用于一些特殊场合的说明,表明静态成员能在类的内部定义该类的对象。
• 将该函数声明为静态保证对象在生成前也能用调用该函数。
• 接着我们讨论一下静态成员变量的生命周期,静态成员变量存在于整个程序周期中,在程序结束时被析构销毁。
• 最后条件判断是否是第一次调用,如果是第一次调用,则new了一个对象指针,因为是在对象内部,可以调用私有的构造函数,完成对象的创建。


4、单例模式的用途
• 代替全局变量
• 在需要保证只有一个实例的情况中


5、代码实例
打印机实例(来自 <http://www.jb51.net/article/55969.htm> )
singleton.h文件代码如下:
1 #ifndef _SINGLETON_H_
2 #define _SINGLETON_H_
3  
4 class Singleton
5 {
6 public:
7  static Singleton* GetInstance();
8  void printSomething(const char* str2Print);
9 protected:
10  Singleton();
11 private:
12  static Singleton *_instance;
13  int count;
14 };
15  
16 #endif
singleton.cpp文件代码如下:
?
1 #include "singleton.h"
2 #include <iostream>
3  
4 using namespace std;
5  
6 Singleton* Singleton::_instance = 0;
7  
8 Singleton::Singleton()
9 {
10  cout<<"create Singleton ..."<<endl;
11  count=0;
12 }
13  
14 Singleton* Singleton::GetInstance()
15 {
16  if(0 == _instance)
17  {
18    _instance = new Singleton();
19  }
20  else
21  {
22    cout<<"Instance already exist"<<endl;
23  }
24  
25  return _instance;
26 }
27  
28 void Singleton::printSomething(const char* str2Print)
29 {
30  cout<<"printer is now working , the sequence : "<<++count<<endl;
31  cout<<str2Print<<endl;
32  cout<<"done\n"<<endl;
33 }
main.cpp文件代码如下:
?
1 #include "singleton.h"
2  
3 int main()
4 {
5  Singleton *t1 = Singleton::GetInstance();
6  t1->GetInstance();
7  t1->printSomething("t1");
8  
9  Singleton *t2 = Singleton::GetInstance();
10  t2->printSomething("t2");
11  return 0;
12 }


5、其他
• 关于静态对象的手动释放问题,参考博客http://lwzy-crack.blog.163.com/blog/static/9527204220091068526135/

单例模式