Singleton单件模式

来源:互联网 发布:pp助手mac版下载 编辑:程序博客网 时间:2024/04/30 17:56

Singleton单件模式是GoF给出的最简单的设计模式,它允许一个类有且只有一个实例。以下是在CPP中实现一个单件模式。

class MySingleton{private:int value;//other values....static MySingleton _instance;//不允许赋值MySingleton & operator=(MySingleton& m){}//不允许赋值构造函数MySingleton(MySingleton & m){}protected://默认构造函数是保护的MySingleton():value(0){}public:static MySingleton& Instance(){return _instance;}int GetValue(){return value;}void SetValue(int v){value = v;}//other functions...};

 

MySingleton MySingleton::_instance;//全局变量,初始化int main(){MySingleton &s = MySingleton::Instance();MySingleton &s2 = MySingleton::Instance();//&s == &s2}

  

创建一个单件模式的关键是防止客户程序员获得任何控制其对象生存期的权利,因此必须将构造函数声明为private或者protected,并防止编译器隐式生成任何构造函数(拷贝构造函数和赋值构造函数)还必须决定如何去创建这个对象。以上的例子是静态创建的,也可以知道客户程序员提出要求在进行创建(惰性初始化)。有一种例子是使用在类里面维护一个实例的指针:


class MySingleton2{private:int _value;static MySingleton2 *_instance;MySingleton2& operator=(const MySingleton2 &){}MySingleton2(const MySingleton2&){}protected:MySingleton2(int v = 0):_value(v){}public:static MySingleton2* Instance(){if(_instance == 0)_instance = new MySingleton2();return _instance;}~MySingleton2(){if(_instance) delete _instance;}//get set...};MySingleton2 *MySingleton2::_instance = 0;int main(int arg,char* args[]){MySingleton2 * my3 = MySingleton2::Instance();MySingleton2 * my4 = MySingleton2::Instance();cout<<my3<<"   "<<my4<<endl;system("pause");}

    这种做法也是可以,但是有一个问题就是用户可能会不小心删除了此指针,因此第一个例子被认为是最安全的。其次,第一个例子并没有限制只创建一个对象,因为可以支持创建有限个对象的对象池。而第二个例子却只限制了只能创建一个对象(参看构造函数)

	
				
		
原创粉丝点击