設計模式--單例模式C++實現

單例模式C++實現

 

1描述:

單例模式,又稱單件模式。數據庫

定義:確保某一個類只有一個實例,並且自行實例化並向整個系統提供這個實例。安全

2具體類圖描述:

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;

}

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();

}

相關文章
相關標籤/搜索