設計模式:單例模式


單例模式中的懶漢模式:第一次調用該類實例的時候才產生一個新的該類實例,並在以後僅返回此實例。
//sing.h
#ifndef _SING_H_
#define _SING_H_
#include <iostream>
using namespace std;
class singleton
{
   public:
static singleton* Instance();
   protected:
  singleton();
   private:
  static singleton *_instance;

};
#endif
//singh.cpp
#include "stdafx.h"
#include "sing.h"
#include <iostream>
using namespace std;
singleton* singleton::_instance=0;
singleton::singleton()
{
cout<<"singleton"<<endl;
}
singleton* singleton::Instance()
{
if(_instance==0)
{
_instance=new singleton();
}
return _instance;
}
//main.cpp
#include "stdafx.h"
#include "sing.h"
#include <iostream>
using namespace std;
using namespace System;

int main(array<System::String ^> ^args)
{
   singleton* stn=singleton::Instance();
    return 0;
}

單例模式:通過維護一個static的成員變量來記錄這
個唯一的對象實例。通過提供一個staitc的接口instance來獲得這個唯一的實例。
當singleton遇上多線程時,由於singleton對象是共享的全局資源,而共享的全局資源對於競態條件和多線程環境都是不安全的。
雙檢測鎖定模式(double-checked locking)
#include "stdafx.h"
#include "sing.h"
#include <iostream>
using namespace std;
singleton* singleton::_instance=0;
singleton::singleton()
{
cout<<"singleton"<<endl;
}
singleton* singleton::Instance()
{
if(_instance==0)
{
//Lock();此處未實現
if(_instance==0)
{
_instance=new singleton();
}
//UnLock();
}
return _instance;
}
餓漢模式:即無論是否調用該類的實例,在程序開始時就會產生一個該類的實例,並在以後僅返回此實例。
靜態實例初始化在程序開始時進入主函數之前就由主線程以單線程方式完成了初始化,不必擔心多線程問題。
故在性能需求較高時,應使用這種模式,避免頻繁的鎖爭奪。
#include "stdafx.h"
#include "sing.h"
#include <iostream>
using namespace std;

singleton* singleton::_instance=new singleton();//初始化時就新建實例
singleton::singleton()
{
cout<<"singleton"<<endl;
}
singleton* singleton::Instance()
return _instance;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章