一、設計模式簡介
1、什么是設計模式
針對反復出現的問題所總結歸納出的通用解決方設計模式是指在軟件開發過程中案。這些方案是眾多軟件開發人員經過大量實踐總結出來的,具有高效性、可維護性和可擴展性等優點。使用設計模式可以幫助開發者更高效地構建軟件系統,提高代碼的復用性、可維護性和可擴展性,同時也能降低系統的耦合度。
2、設計模式分類
大體上設計模式分為3中類型:創建型、結構型和代碼型
23種設計模式
二、單例設計模式
其特點是只提供唯一一個類的設計模式,具有全局變量的特點,在任何位置都可以通過接口獲取到唯一實例。他的優點顯而易見:
他能夠避免對象重復創建,節約空間并提升效率
避免由于操作不同實例導致的邏輯錯誤
單例模式有兩種實現模式:餓漢式和懶漢式
餓漢:餓了肯定要饑不擇?。所以在單例類定義的時候就進?實例化。
懶漢:在第?次?到類實例的時候才會去實例化。什么時候使?,什么時候創建單例
#include <iostream>
#include <string>
#include<memory>using namespace std;
//單例的 餓漢模式的實現--特點:在定義類的時候就創建了一個對象
class Singleton
{public://Singleton(const Singleton&temp )=delete;static Singleton*get_instance(){return instance;}void test(){cout << "測試"<<this << endl;}private:Singleton()=default;//Singleton(const Singleton&temp )=default; Singleton(const Singleton&temp )=default;Singleton& operator=(const Singleton&temp)=default;static Singleton*instance;};Singleton*Singleton::instance=new Singleton;int main()
{Singleton *obj1= Singleton::get_instance();Singleton *obj2= Singleton::get_instance();obj1->test();obj2->test();return 0;
}
//測試0x1fb01e91750
//測試0x1fb01e91750
#include <iostream>
#include <string>
#include<memory>using namespace std;
//單例的 懶漢模式的實現--特點:第一次用類的實例才創建對象
//對于多線程環境下 餓漢模式它是線程安全的,對于懶漢模式在多線程下是不全的。
class Singleton
{public://Singleton(const Singleton&temp )=delete;static Singleton*get_instance(){if(instance==nullptr){instance=new Singleton;}return instance;}void test(){cout << "測試"<<this << endl;}private:Singleton()=default;//Singleton(const Singleton&temp )=default; Singleton(const Singleton&temp )=default;Singleton& operator=(const Singleton&temp)=default;static Singleton*instance;};Singleton*Singleton::instance=nullptr;int main()
{Singleton *obj1= Singleton::get_instance();Singleton *obj2= Singleton::get_instance();obj1->test();obj2->test();return 0;
}
//測試0x1fb01e91750
//測試0x1fb01e91750
#include <iostream>
#include <string>
#include<memory>
#include<mutex>using namespace std;
//單例的 懶漢模式的實現--特點:第一次用類的實例才創建對象
//對于多線程環境下需要加鎖實現實例的唯一性, 對于懶漢模式在多線程下是不安全的。
class Singleton
{public:static Singleton*get_instance(){if(instance==nullptr){lock.lock();if(instance==nullptr){instance=new Singleton;}lock.unlock();}return instance;}void test(){cout << "測試"<<this << endl;}private:Singleton()=default;//Singleton(const Singleton&temp )=default; Singleton(const Singleton&temp )=default;Singleton& operator=(const Singleton&temp)=default;static Singleton*instance;static mutex lock;};Singleton*Singleton::instance=nullptr;
mutex Singleton::lock;//通過該類的默認構造函數來進行初始化,默認初始化為不上鎖狀態int main()
{Singleton *obj1= Singleton::get_instance();Singleton *obj2= Singleton::get_instance();obj1->test();obj2->test();return 0;
}
//測試0x1fb01e91750
//測試0x1fb01e91750
基礎要點: 全局只有?個實例:static 特性,同時禁??戶??聲明并定義實例(把構造 函數設為 private) 線程安全 禁?賦值和拷? ?戶通過接?獲取實例:使? static 類成員函數
關于如何選擇懶漢和餓漢模式:
懶漢:在訪問量較?時,采?懶漢實現。這是以時間換空間。
餓漢:由于要進?線程同步,所以在訪問量?較?,或者可能訪問的線程?較 多時,采?餓漢實現,可以實現更好的性能。這是以空間換時間。
加了鎖,使?互斥量來達到線程安全。這?使?了兩個 if 判斷語句的技術稱為 雙檢鎖;好處是,只有判斷指針為空的時候才加鎖,避免每次調? getInstance 的?法都加鎖,鎖的開銷畢竟還是有點?的。