webrtc對criticalsection進行了封裝,可以實現在windows和支援posix平台使用鎖。
基本結構如下:
在Factory 方法中去負責具體類的對象的建立,可以稱之為簡單原廠模式,一個工廠負責所有產品的建立,通過向工廠傳入必要的參數來進行不同產品的建立,一般建立的產品是有關係的,它們共同繼承自一個抽象類別。
針對CriticalSectionWrapper,可以把它看做是一個工廠,它擁有一個Factory 方法CreateCriticalSection。它負責建立具體的執行個體對象,它傳入的參數很特別,是個宏,處於windows環境建立windows對象,處於posix環境,建立posix對象。
這個還有一點特別之處是工廠類同時還是產品類的抽象基類,即工廠負責生產產品,同時它由有抽象產品的介面。
如果換種方案來看,將Enter和Leave方法放到另一個抽象類別中,作為具體產品的基類,其實也是可以的,Factory 方法返回基類的指標。
具體代碼如下,抽象類別,有一個Factory 方法
class CriticalSectionWrapper { public: // Factory method, constructor disabled static CriticalSectionWrapper* CreateCriticalSection(); virtual ~CriticalSectionWrapper() {} // Tries to grab lock, beginning of a critical section. Will wait for the // lock to become available if the grab failed. virtual void Enter() = 0; // Returns a grabbed lock, end of critical section. virtual void Leave() = 0;};
具體的Factory 方法
CriticalSectionWrapper* CriticalSectionWrapper::CreateCriticalSection() {#ifdef _WIN32 return new CriticalSectionWindows();#else return new CriticalSectionPosix();#endif}
兩個子類負責不同平台下鎖的建立工作
class CriticalSectionPosix : public CriticalSectionWrapper { public: CriticalSectionPosix(); virtual ~CriticalSectionPosix(); virtual void Enter(); virtual void Leave(); private: pthread_mutex_t mutex_; friend class ConditionVariablePosix;};
class CriticalSectionWindows : public CriticalSectionWrapper { public: CriticalSectionWindows(); virtual ~CriticalSectionWindows(); virtual void Enter(); virtual void Leave(); private: CRITICAL_SECTION crit; friend class ConditionVariableWindows;};
實現代碼很簡單就不貼出來了,基本上就是建構函式初始化,解構函式釋放,enter和leave分別是加鎖和解鎖操作。
感覺沒有libjingle的talk/base寫的簡潔,那個採用了另一種思想,通過將類的名字和方法的名字命名一直來達到不同平台叫用一致的目的。
以後作為一個庫使用吧,它幫我們做了跨平台多好。。。。
簡單說一下簡單工廠和Factory 方法兩個模式的不同:
簡單原廠模式:
一個Factory 方法負責所有對象的建立,當增加新的產品就需要更改上層的Factory 方法。可以採用另一種註冊的思想:工廠類中維護一個鏈表,當使用者註冊了新的產品
加入到鏈表中,就可以實現增加新的產品,不更改上層抽象層的工作。
Factory 方法模式:
將對對象的建立延遲到子類中,由子工廠負責具體產品類的建立
有一個抽象工廠類,且有一個工廠介面,每一個具體工廠都需要實現該介面來建立具體的產品,應用Factory 方法通常是建立的產品
是相關的,所有的產品有一個抽象基類,這樣抽象工廠的傳回值就可以定為抽象產品類指標,供給客戶使用。
客戶可能需要執行個體化具體的工廠來建立具體的某一種產品