設計模式
目的
實現可重用解決方案,構筑易維護、可擴展的軟件系統。
六大原則
單一職責: 類的職責單一,一個方法做一件事。
開閉原則: 拓展開放,修改關閉。
里氏替換: 父類能出現的地方,子類可以替換。子類必須全部實現父類方法,盡量不暴露自己public
方法供外界使用。覆蓋或實現父類方法時,輸入參數可以多。
依賴倒置: 模塊之間的依賴通過抽象發生,具體類之間不依賴。每個類盡量有抽象類,任何類不應該從具體類派生,盡量不重寫基類方法。
迪米特法則: 盡量減少對象間交互,從而減少類間耦合。
接口隔離原則: 類間的依賴關系建立在最小的接口上。
抽象構建框架,實現拓展細節。
單例模式
一個類只有一個對象,及系統中只有一個實例,實例被所有程序模塊共享。
例如服務器配置信息放在一個文件中,配置數據由單例對象統一讀取,服務進程的其他對象通過單例對象獲取配置信息。
實現
有餓漢模式和懶漢模式兩種實現模式。
餓漢模式
程序啟動就創建唯一實例對象。
多線程獲取單例對象不需要加鎖。
#include <iostream>
#include <string>class Singleton {
private:// 私有構造函數,防止外部創建實例Singleton() : data("Singleton") {std::cout << "Singleton instance created!" << std::endl;}// 私有析構函數,防止外部刪除實例~Singleton() {}// 刪除拷貝構造函數和賦值運算符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;// 靜態成員變量,類加載時初始化static Singleton instance;// 成員變量std::string data;public:// 獲取單例對象的靜態方法static Singleton& getInstance() {return instance;}// 獲取成員變量的方法std::string& getData() {return data;}
};// 在類外初始化靜態成員變量
Singleton Singleton::instance;int main() {// 獲取單例對象Singleton& singleton = Singleton::getInstance();// 訪問單例對象的成員變量std::cout << "Data: " << singleton.getData() << std::endl;// 再次獲取單例對象,驗證是否為同一個實例Singleton& singleton2 = Singleton::getInstance();if (&singleton == &singleton2) {std::cout << "Both references point to the same instance!" << std::endl;}return 0;
}
懶漢模式
如果單例對象構造特別耗時或者耗資(加載插件、網絡),可在第一次使用時才創建對象。
C++11
之后,局部靜態變量的初始化是線程安全的,因此可以直接使用局部靜態變量實現懶漢模式。
#include <iostream>
#include <string>class Singleton {
private:// 私有構造函數,防止外部創建實例Singleton() : data("Singleton") {std::cout << "Singleton instance created!" << std::endl;}// 私有析構函數,防止外部刪除實例~Singleton() {}// 刪除拷貝構造函數和賦值運算符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;// 成員變量std::string data;public:// 獲取單例對象的靜態方法static Singleton& getInstance() {static Singleton instance; // 局部靜態變量,線程安全return instance;}// 獲取成員變量的方法std::string& getData() {return data;}
};int main() {// 獲取單例對象Singleton& singleton = Singleton::getInstance();// 訪問單例對象的成員變量std::cout << "Data: " << singleton.getData() << std::endl;// 再次獲取單例對象,驗證是否為同一個實例Singleton& singleton2 = Singleton::getInstance();if (&singleton == &singleton2) {std::cout << "Both references point to the same instance!" << std::endl;}return 0;
}
推薦一下
https://github.com/0voice