单例模式
最初接触到设计模式这个玩意儿是因为一次笔试,问题是设计一个只能实例化一个对象的类,然后郁结了很久,最后写出来的代码一团糟,完全达不到效果。然后回来google一下,才发现我有多孤陋寡闻。好了,闲话不说,进入正题。
根据维基百科的释义,单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。
实现的思路即是,将类的构造函数声明为私有的,该类能返回对象的引用(用一个类指针保存,通常声明为static)和获取这个实例的函数(通常是getInstance)。当这个引用为空时,说明类没有实例对象,此时,创建该类的实例对象,且把实例的引用赋给类指针。当引用不为空时,返回类指针指向的对象。
具体实现如下:
1 #include<iostream> 2 #include<cstdlib> 3 using namespace std; 4 5 class Singleton 6 { 7 private: 8 Singleton(); 9 static Singleton* instance; 10 int data; //test data 11 public: 12 ~Singleton(); 13 static Singleton* getInstance(); 14 }; 15 16 Singleton* Singleton::instance = NULL; 17 18 Singleton::Singleton() 19 { 20 data = 10; 21 cout<<"Singleton constructure...."<<endl; 22 } 23 24 Singleton* Singleton::getInstance() 25 { 26 if(instance == NULL) 27 instance = new Singleton(); 28 return instance; 29 } 30 31 Singleton::~Singleton() 32 { 33 if(instance != NULL) 34 { 35 cout<<"Singleton destructure"<<endl; 36 //delete instance;//静态数据是由OS释放的 37 instance == NULL; 38 //system("pause"); 39 } 40 } 41 42 int main() 43 { 44 Singleton *ton = Singleton::getInstance(); 45 delete ton; 46 system("pause"); 47 return 0; 48 }
需要注意的是,因为instance是静态的(static),因此在析构函数中千万不要写出delete instance;这样的语句来,因为静态数据是存储在全局区(静态区)的,它们实在程序结束后由系统回收的。这条语句的后果就是引发异常(无限执行析构函数)。