C++筆記 第六十二課 單例類模板---狄泰學院
阿新 • • 發佈:2018-12-01
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux
第六十二課 單例類模板
1.單例模式
需求的提出
在構造設計時,某些類在整個系統生命期中最多隻能有一個物件存在(Single Instance).
2.問題
如何定義一個類,使得這個類最多隻能建立一個物件?單例模式
3.單例模式
要控制類的物件數目,必須對外隱藏建構函式
思路:
將建構函式的訪問屬性設定為private(外界無法建立物件)
定義instance並初始化為NULL
當需要使用物件時,訪問instance的值
空值:建立物件,並用instance標記
非空值:返回instance標記的物件
62-1 單例模式初探
#include <iostream> #include <string> using namespace std; class SObject { //1.為建立唯一物件,將建立物件各種途徑私有化,外界無法建立物件 static SObject* c_instance; //2.設計個標誌用來標記物件,標記為靜態成員變數 SObject(const SObject&);//拷貝建構函式 SObject& operator = (const SObject&);//賦值操作符 SObject()//建構函式 { } public: static SObject* GetInstance();//4.定義靜態成員函式用於提供唯一建立物件途徑 void print() { cout << "this = " << this << endl; } }; SObject* SObject::c_instance = NULL; //3.在定義靜態成員變數時,將這個靜態變數設定為空 SObject* SObject::GetInstance() //8.如果再次建立物件時,仍需要用這個靜態函式來建立,如果有一個,則進行第7步 { if(c_instance == NULL) //5.首先看下標記是否為空,如果一個物件都沒有,則可以建立一個物件 { c_instance = new SObject();//6.建立完成後,用這個唯一的標記來標記物件 } return c_instance;//7.將此物件返回 } int main() { SObject* s = SObject::GetInstance(); SObject* s1 = SObject::GetInstance(); SObject* s2 = SObject::GetInstance(); s->print(); s1->print(); s2->print(); return 0; } 執行結果 this = 0x14ffc20 this = 0x14ffc20 this = 0x14ffc20
存在的問題
需要使用單例模式時:
必須定義靜態成員變數c_instance
必須定義靜態成員函式GetInstance()
解決方案
將單例模式相關的程式碼抽取出來,開發單例類模板。當需要單例類時,直接使用單例類模板。
62-2 單例類模板
Singleton.h #ifndef _SINGLETON_H_ #define _SINGLETON_H_ template <typename T> class Singleton { static T* c_instance; public: static T* GetInstance(); }; template <typename T> T* Singleton<T>::c_instance = NULL; template <typename T> T* Singleton<T>::GetInstance() { if(c_instance == NULL) { c_instance = new T(); } return c_instance; } #endif
62-2.cpp
#include <iostream>
#include <string>
#include "Singleton.h"
using namespace std;
class SObject
{
friend class Singleton<SObject>;
SObject(const SObject&);
SObject& operator = (const SObject&);
SObject()
{
}
public:
void print()
{
cout << "this = " << this << endl;
}
};
int main()
{
SObject* s = Singleton<SObject>::GetInstance();
SObject* s1 = Singleton<SObject>::GetInstance();
SObject* s2 = Singleton<SObject>::GetInstance();
s->print();
s1->print();
s2->print();
return 0;
}
執行結果
this = 0xa60c20
this = 0xa60c20
this = 0xa60c20
小結
單例模式是開發中最常用的設計模式之一
單例模式的應用使得一個類最多隻有一個物件
可以將單例模式相關的程式碼抽象成類模板
需要使用單例模式的類直接使用單例模板