當前位置:
首頁 > 知識 > 設計模式之單例模式

設計模式之單例模式


意圖

保證一類僅有一個實例,並提供一個訪問它的全局訪問點。


適用性

在下面的情況下可以使用Singleton模式:

  • 當類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時。
  • 當這個唯一的實例應該是通過子類可擴展的,並且客戶應該無需更改代碼就能使用一個擴展的實例時

UML圖

設計模式之單例模式

  • Instance

——定義一個Instance操作,允許客戶訪問它的唯一實例。

——可能負責創建它自己的唯一實例。


實現

保證一個唯一的實例

為保證類示例的唯一性,需要提供一個統一的介面,一般是靜態函數,來保證只有一個實例被創建。需要注意的是,客戶只能通過Instance來訪問這個單件。

//.h
class Singleton{
public:
static Singleton * Instance;
protected:
Singleton;
private:
static Singleton * _isntance;
};
//.cpp
Singleton *Singleton::_isntance = 0;
Singleton *Singleton::Instance{
if(_isntance == 0){
_isntance = new Singleton;
}
return _isntance;
}

創建Singleton類的子類

為保證子類的唯一實例,GOF一書中提到了單件註冊表(registry of singleton)。下面用一個map對象和虛函數GetName來模擬之。

//.h
class Singleton{
public:
static void Register(const char* name, Singleton*);//註冊子類單例
static Singleton * Instance;
protected:
Singleton;
virtual const& string GetName;//子類繼承該函數並定義實例名稱
private:
static Singleton * _instance;
static std::map<string name, Singleton*> _registry;
string _name;//單例類名稱
};

//.cpp
Singleton *Singleton::_instance = 0;

Singleton::Singleton{
_name = "Singleton";
Singleton::Register(_name, this);
}

const& string Singleton::GetName{
return _name;
}

Singleton *Singleton::Instance{
if(_instance == 0){
_instance = _registry[GetName()];
}
return _instance;
}
//註冊子類單例
void Singleton::Register(const char* name, Singleton* single){
auto item = _registry.find(name);
if(item != _registry.end){
return;
}
else{
_registry.insert(std::make_pairs<name, single>);
}
}

子類MySingleton繼承實現如下,只需要重新實現虛函數GetName,重新定義_name並調用子類的Register註冊當前實例:

//.h
class MySingleton : public Singleton{
protected:
MySingleton;
virtual const& string GetName;
private:
string _name;//單例類名稱
};

//.cpp
MySingleton::MySingleton{
_name = "MySingleton";
Singleton::Register(_name, this);
}
const& string MySingleton::GetName{
  return _name;
}

子類必須要創建,否則不會被註冊,可以在包含MySingleton的實現中創建:

static MySingleton theSingleton;

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

NET中解決KafKa多線程發送多主題的問題
設計模式解密(18)- 原型模式
Spring初始化ApplicationContext線程託管實際運用架構構思

TAG:科技優家 |

您可能感興趣

設計模式之代理模式
單例模式介紹
設計模式概念
單例模式的特點
拍攝模式之Auto模式及曝光程序模式
每日一博丨淺談設計模式之建造者模式
社交產品設計模式
設計模式之觀察者模式源碼分析及實踐
24種設計模式及案例
狀態的模式
反射與代理設計模式-動態代理設計模式
淺談遊戲設計模式分析
請設計你的商業模式
戰地模擬器軍營比賽模式玩法介紹 軍營比賽模式怎麼
打破舊有模式 建立新模式
摺疊式設計,兩種運動模式!小米生態鏈「智能走步機」評測
PHP設計模式—服務定位器
荒野行動預計本周更新 守護模式靶場模式雙雙上線
原來設計「創新的商業模式」如此的簡單
基於模型的嵌入式軟體開發模式