單例模式C++實現
1描述:
單例模式,又稱單件模式。
定義:確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。
2具體類圖描述:
2.1 StartUML內部生成模式類圖

該類圖由StartUML逆向生成C++代碼
class Singleton {
public:
static Singleton* Instance();
protected:
Singleton();
private:
static Singleton *instance;
};
Singleton* Singleton::Instance()
{
if(instance==NULL)
instance = new Singleton();
return instance;
}
3.詳解:
根據單例模式的定義,那么實現這個需求,我們最簡單的方法是
①定義一個全局靜態對象,給系統使用。
②單例模式實現需求。
注:這兩個方都是可以滿足需求的,但是呢,想想6大原則:依賴倒置,接口隔離。我們的設計應當是依賴接口,而非對象,那么久pass 刁①吧。
4單例模式的優缺點:
優點:一個實例,減少內存開銷;減少系統開銷;避免對一個資源的多重占用;設置全局訪問點,優化和貢獻資源。
缺點:沒有借口,擴展性差;不利於測試;與單一職責原則有沖突,單例模式把“要單例”和業務邏輯融合在一個類中。
5使用場景:
要求生成唯一序列號的環境;
共享數據或者共享訪問點;
創建一個對象需要消耗的資源過多,如訪問IO和數據庫等資源;
需要定義大量的靜態常量和靜態方法(工具類)
6線程安全問題
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;
}
7單例模式的擴展--多例模式。
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); //隨機去除一個實例來用
}
8問題
關於多例模式中的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();
}
