C++運用靜態成員實現單例模式
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
Singleton(單例):在單例類的內部實現只生成一個實例,同時它提供一個靜態的
getInstance()
方法,讓客戶可以訪問它的唯一實例;爲了防止在外部對其實例化,將其默認構造函數和拷貝構造函數設計爲私有;在單例類內部定義了一個Singleton類型的靜態對象,作爲外部共享的唯一實例。用單例模式,模擬公司員工使用打印機場景,打印機可以打印員工要輸出的內容,並且可以累積打印機使用次數。
單例模式,只需要把握以下幾點即可:
- 將 默認構造 和 拷貝構造 私有化(這樣就不能通過構造函數來創建對象)
- 內部維護一個 靜態對象指針(類內聲明,類外實現,實現對象的唯一性)
- 私有化唯一指針(私有化之後無法通過外部對對象指針進行修改,實現真正的唯一)
- 對外提供
getInstance()
方法來訪問這個指針(由於對象指針私有化,此方法用來給出接口獲取唯一對象)
保證類中只能實例化唯一一個對象
class Printer{
public:
static Printer* getInstance(){ return pPrinter;}
void PrintText(string text){
cout << "打印內容:" << text << endl;
cout << "已打印次數:" << mTimes << endl;
cout << "--------------" << endl;
mTimes++;
}
//默認構造 和 拷貝構造 私有化
private:
Printer(){ mTimes = 0; }
Printer(const Printer&){}
private:
static Printer* pPrinter;
int mTimes;
};
Printer* Printer::pPrinter = new Printer;//靜態對象指針的類外實現
void test(){
Printer* printer = Printer::getInstance();
printer->PrintText("離職報告!");
printer->PrintText("入職合同!");
printer->PrintText("提交代碼!");
}
注:
new Printer
先於main函數調用,編譯時就已經創建了