單例模式是一種建立型的模式,適用於 全局只有一個對象的類,設計模式
結構圖安全
只有一個靜態 實例變量 和一個靜態 函數函數
class Singleton { public: /** * @brief get the instance * @return the singleton instance */ static Singleton * Instance() { static Singleton* _ins = nullptr; if (_ins == nullptr) { _ins = new Singleton; } return _ins; } private: Singleton(){} }; int main(int argc, char *argv[]) { auto ins = Singleton::Instance(); system("pause"); return 0; }
外部經過Instance() 靜態函數來獲取 惟一實例ui
存在的問題:線程
線程安全性設計
可用double check解決,同步操做以前 判斷一次是否爲nullptr 從而減少同步開銷代理
可在程序啓動後初始化實例code
2. 對象銷燬問題server
//C 11下才能保證 https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_C.2B.2B11 class A { public: A() { Sleep(100); func; } ~A() { } static A * getInstance1();//線程不安全 static A * getInstance2();//無鎖,比double check 效率高不少 }; A * A::getInstance1() { static A *ins = NULL; if (ins == NULL) { ins = new A; } return ins; } A * A::getInstance2() { static A ins; return &ins; } void threadFunc(void) { while (true) { A::getInstance2(); } } int main() { // A::getInstance(); vector<thread> ws; for (int i = 0; i < 10; i++) { thread t(threadFunc); t.detach(); // ws.push_back(std::move(t)); } while (1)Sleep(1); system("pause"); return 0; }
1.建立型模式對象
前面講過,社會化的分工愈來愈細,天然在軟件設計方面也是如此,所以對象的建立和對象的使用分開也就成爲了必然趨勢。由於對象的建立會消耗掉系統的不少資源,因此單獨對對象的建立進行研究,從而可以高效地建立對象就是建立型模式要探討的問題。這裏有6個具體的建立型模式可供研究,它們分別是:
簡單工廠模式(Simple Factory);
工廠方法模式(Factory Method);
抽象工廠模式(Abstract Factory);
建立者模式(Builder);
原型模式(Prototype);
單例模式(Singleton)。
說明:嚴格來講,簡單工廠模式不是GoF總結出來的23種設計模式之一。
2.結構型模式
在解決了對象的建立問題以後,對象的組成以及對象之間的依賴關係就成了開發人員關注的焦點,由於如何設計對象的結構、繼承和依賴關係會影響到後續程序的維護性、代碼的健壯性、耦合性等。對象結構的設計很容易體現出設計人員水平的高低,這裏有7個具體的結構型模式可供研究,它們分別是:
外觀模式(Facade);
適配器模式(Adapter);
代理模式(Proxy);
裝飾模式(Decorator);
橋模式(Bridge);
組合模式(Composite);
享元模式(Flyweight)。
3.行爲型模式
在對象的結構和對象的建立問題都解決了以後,就剩下對象的行爲問題了,若是對象的行爲設計的好,那麼對象的行爲就會更清晰,它們之間的協做效率就會提升,這裏有11個具體的行爲型模式可供研究,它們分別是:
模板方法模式(Template Method);
觀察者模式(Observer);
狀態模式(State);
策略模式(Strategy);
職責鏈模式(Chain of Responsibility);
命令模式(Command);
訪問者模式(Visitor);
調停者模式(Mediator);
備忘錄模式(Memento);
迭代器模式(Iterator);
解釋器模式(Interpreter)。