在同一项目中我们怎样实现数据共享?最简单办法就是将该数据设置为全局变量。这样所有需要使用该变量的地方得到的就是相同的数据了。但是,在面向对象程序设计中,设置全局变量会破坏封装原则,不符合OOP的要求。因此,通过static关键字将类中需要共享的数据成员设置为静态数据成员也可达到相同的目的。
关于类的静态数据成员有几点需要说明:
1、静态数据成员不属于任何类的实例,为所有实例所共享,因此在内存中只占有一份空间,因此它旦被修改则在所有实例中都将修改,这是毫无疑问的,和全局变量一样;2、静态数据成员既可以通过类的实例进行访问,又直接可以通过类名来访问;3、静态数据成员只能在类外进行初始化操作,静态成员函数是专门用来处理静态数据成员的,它也只是类的一部分而和实例无关。
回顾了这么多关于静态成员的知识,是为了引出今天的主角——单例模式。
全局变量和静态数据成员在项目中都只是唯一的,假如我们想让每一个类都只有一个实例存在于项目中,任何操作都只在这个实例上进行,我们也可以用和静态成员同样的思路进行设计,这就是单例模式的思想。同样是通过static关键字,我们通过一个Singleton类来创建类的唯一实例。
下面通过C++中的类模板来举个例子:
#include <iostream> using namespace std; template <typename T> class Singleton { public: static T* GetInstance() { if (!t_) { t_ = new T(); } return t_; } private: Singleton(); static T* t_; }; template <typename T> T* Singleton<T>::t_ = NULL; class Student { public: void print() { cout << "this is Student" << endl; } }; int main(void) { Student *s1 = Singleton<Student>::GetInstance(); Student *s2 = Singleton<Student>::GetInstance(); if (s1 == s2) { cout << "两个实例相同!" << endl; } return 0; }
其中,Singleton类通过静态成员函数GetInstance来创建静态数据成员,这个静态数据成员可以基本数据类型,也可以是我们自己定义的类。如果该类的实例不存在这创建一个新的实例,否则直接返回原实例,从而实现单例。
以上。
ref:
《大话设计模式》
《C++程序设计》
http://blog.csdn.net/wuzhekai1985/article/details/6665869