最近在學習設計模式,用的是 《Head First 設計模式》這本書。感覺這本書寫的還是很不錯的,深入淺出的介紹了各種常用的設計模式。唯一有點不方便的地方是這本書的例子全都是用的 java 來實現的。而我主要是用 C++。所以就動手將書上的代碼用 C++ 來實現了一遍。
單例模式相對比較簡答,只要將類的構造函數搞成 PRivate 就行了。
///ChocolateBoiler.h#ifndef CHOCOLATEBOILER_H#define CHOCOLATEBOILER_Hclass ChocolateBoiler{public: void fill(); void drain(); void boil(); bool isEmpty() {return m_empty;} bool isBoiled() {return m_boiled;} static ChocolateBoiler * getInstance();private: ChocolateBoiler(); bool m_empty; bool m_boiled; static ChocolateBoiler * m_instance;};#endif // CHOCOLATEBOILER_H///ChocolateBoiler.cpp#include "chocolateboiler.h"#include <iostream>using std::cout;using std::endl;ChocolateBoiler::ChocolateBoiler(){ m_empty = true; m_boiled = false;}void ChocolateBoiler::fill(){ if(isEmpty()) { m_empty = false; m_boiled = false; cout << "ChocolateBoiler is filled" << endl; // other things }}void ChocolateBoiler::drain(){ if(!isEmpty() && isBoiled()) { // m_empty = true; cout << "ChocolateBoiler is drained" << endl; }}void ChocolateBoiler::boil(){ if(!isEmpty() && !isBoiled()) { m_boiled = true; cout << "ChocolateBoiler is boiled" << endl; }}ChocolateBoiler * ChocolateBoiler::m_instance = nullptr;ChocolateBoiler * ChocolateBoiler::getInstance(){ if(!m_instance) // 如果用在多線程環境下,這里需要加鎖 { m_instance = new ChocolateBoiler; } return m_instance;}如果希望在程序一運行時就建立對象,可以這樣寫:
ChocolateBoiler * ChocolateBoiler::m_instance = new ChocolateBoiler;ChocolateBoiler * ChocolateBoiler::getInstance(){ return m_instance;}這里用到的知識點就是 static 類型的變量是在程序運行的最開始初始化的。
新聞熱點
疑難解答
圖片精選