單例模式,又稱單件模式。數據庫
定義:確保某一個類只有一個實例,並且自行實例化並向整個系統提供這個實例。安全
2.1 StartUML內部生成模式類圖dom
該類圖由StartUML逆向生成C++代碼函數
class Singleton {
public:
static Singleton* Instance();工具
protected:測試
Singleton();優化
private:
static Singleton *instance;
};spa
Singleton* Singleton::Instance()線程
{設計
if(instance==NULL)
instance = new Singleton();
return instance;
}
根據單例模式的定義,那麼實現這個需求,咱們最簡單的方法是
①定義一個全局靜態對象,給系統使用。
②單例模式實現需求。
注:這兩個方都是能夠知足需求的,可是呢,想一想6大原則:依賴倒置,接口隔離。咱們的設計應當是依賴接口,而非對象,那麼久pass 刁①吧。
優勢:一個實例,減小內存開銷;減小系統開銷;避免對一個資源的多重佔用;設置全局訪問點,優化和貢獻資源。
缺點:沒有藉口,擴展性差;不利於測試;與單一職責原則有衝突,單例模式把「要單例」和業務邏輯融合在一個類中。
要求生成惟一序列號的環境;
共享數據或者共享訪問點;
建立一個對象須要消耗的資源過多,如訪問IO和數據庫等資源;
須要定義大量的靜態常量和靜態方法(工具類)
eg.當兩個線程運行至if(instance==NULL)時,可能產生線程安全問題
改進解決
class Singleton {
public:
static Singleton* Instance();
protected:
Singleton();
private:
static Singleton *instance;
};
//對單例直接進行初始化,而再也不方法Instance中進行判斷。
Singleton* Singleton::instance = new Singleton;
Singleton* Singleton::Instance()
{
return instance;
}
class Singleton {
public:
static Singleton* Instance();
protected:
Singleton();
private:
static enum{Max = 100};
static int CurNum = 0;
static list<Singleton *>instance_list;
};
Singleton* Singleton::Instance()
{
Random random = new Random();
int count = random.nextInt(Max); //獲取隨機數
return instance_list.get(count); //隨機去除一個實例來用
}
關於多例模式中的list的初始化:
方案:
class Singleton
{
public:
static Singleton* GetInstance()
{
if (_singletonList.size() == 0)
{
//此處設置函數進行定製list也可
_singletonList.push_back(new Singleton());
_singletonList.push_back(new Singleton());
_singletonList.push_back(new Singleton());
}
else
{
//對於多例模式,選擇例子,返回
Singleton* tmp = _singletonList.back();
_singletonList.pop_back();
return tmp;
}
}
protected:
Singleton()
{}
private:
static list<Singleton*> _singletonList;
};
list<Singleton*> Singleton::_singletonList(NULL);
void main()
{
Singleton* a = Singleton::GetInstance();
Singleton* b = Singleton::GetInstance();
}