freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

c設計模式基礎教程-在線瀏覽

2024-08-09 06:30本頁面
  

【正文】 ,指向本類的變量的靜態(tài)變量指針 懶漢式include iostreamusing namespace std。 m_count = 0。 } public: static Singelton *getInstance() { if (m_singer == NULL ) //懶漢式:1 每次獲取實例都要判斷 2 多線程會有問題 { m_singer = new Singelton。 } static void printT() { cout m_count: m_count endl。 static int m_count。Singelton *Singelton::m_singer = NULL。void main01_1(){ cout 演示 懶漢式 endl。 //只有在使用的時候,才去創(chuàng)建對象。 if (p1 != p2) { cout 不是同一個對象 endl。 } p1printT()。 system(pause)。}////////////////////////////////////////////////////////////////////////////俄漢式class Singelton2{private: Singelton2() { m_singer = NULL。 cout 構造函數Singelton ... do endl。// } return m_singer。 m_singer = NULL。 } } static void printT() { cout m_count: m_count endl。 static int m_count。Singelton2 *Singelton2::m_singer = new Singelton2。void main(){ cout 演示 餓漢式 endl。 //只有在使用的時候,才去創(chuàng)建對象。 if (p1 != p2) { cout 不是同一個對象 endl。 } p1printT()。 Singelton2::FreeInstance()。 system(pause)。 //2多線程中會導致多個實例的產生,從而導致運行代碼不正確以及內存的泄露。 C++中的構造函數簡單來說分兩步: 第一步:內存分配 第二步:初始化成員變量 由于多線程的關系,可能當我們在分配內存好了以后,還沒來得急初始化成員變量,就進行線程切換,另外一個線程拿到所有權后,由于內存已經分配了,但是變量初始化還 沒進行,因此打印成員變量的相關值會發(fā)生不一致現象。class Singelton{private: Singelton() { count ++。 Sleep(1000)。 }private: //防止拷貝構造和賦值操作 Singelton(const Singelton amp。} Singeltonamp。obj) { 。 //2多線程中會導致多個實例的產生,從而導致運行代碼不正確以及內存的泄露。 } static Singelton *releaseSingelton() { if (single != NULL) //需要判斷 { cout釋放資源\nendl。 single = NULL。 } void pirntS() //測試函數 { printf(Singelton printS test count:%d \n, count)。 static int count。//note 靜態(tài)變量類外初始化Singelton *Singelton::single = new Singelton()。int _tmainTTT(int argc, _TCHAR* argv[]){ Singelton *s1 = Singelton::getSingelton()。 if (s1 == s2) { coutok....equalendl。 } s1pirntS()。 cout hello....endl。 return 0。 printf(\n threadfunc%d \n, id)。}void threadfunc(void *myIpAdd){ int id = GetCurrentThreadId()。 Singelton::getSingelton()pirntS()。} int _tmain(int argc, _TCHAR* argv[]){ int i = 0。 HANDLE hThread[201]。 for (i=0。 i++) { //hThread[i] = (HANDLE)_beginthreadex( NULL, 0, amp。dwThreadId[i] )。threadfunc, 0 , 0 )。 break。 ithreadnum。 } printf(等待線程結束\n)。 ithreadnum。 } Singelton::releaseSingelton()。 system(pause)。} Locking優(yōu)化新建MFC對話框應用程序。//臨界區(qū)static CCriticalSection cs。 Sleep(1000)。 } Singleton(const Singleton amp。 Singletonamp。)。 }//請思考;懶漢式的DoubleCheck是一個經典問題!為什么需要2次檢查 “if(pInstance == NULL)”場景:假設有線程線程線程3,同時資源競爭。//4)假若第2個線程進入臨界區(qū),此時第2個線程需要再次判斷 if(pInstance == NULL)”,若第一個線程已經創(chuàng)建實例;第2個線程就不需要再次創(chuàng)建了。通過檢查發(fā)現實例已經new出來,就不需要再次創(chuàng)建;保證了單例。 //只有當pInstance等于null時,才開始使用加鎖機制 二次檢查 if(pInstance == NULL) { pInstance = new Singleton()。 } return pInstance。 }。void CMy01單例優(yōu)化Dlg::OnBnClickedButton1(){ CCriticalSection cs。 ()。 TRACE(\n threadfunc%d \n, id)。 //Singelton::getSingelton()pirntS()。 DWORD dwThreadId[201], dwThrdParam = 1。 int threadnum = 3。 ithreadnum。threadfunc, NULL, 0,amp。 hThread[i] = (HANDLE)_beginthread(amp。 if (hThread[i] == NULL) { TRACE(begin thread %d error!!!\n, i)。 } } for (i=0。 i++) { WaitForSingleObject( hThread[i], INFINITE )。 for (i=0。 i++) { //CloseHandle( hThread[i] )。 TRACE(ddddd\n)。這需要引入同步機制。引入同步機制的第一個原因是為了控制線程之間的資源同步訪問,因為多個線程在共享資源時如果發(fā)生訪問沖突通常會帶來不正確的后果。結果,我們將無法得知所讀取的數據是新的還是舊的,或者是二者的混合。為了在多線程程序中解決同步問題,Windows提供了四種主要的同步對象,每種對象相對于線程有兩種狀態(tài)——信號狀態(tài)(signal state)和非信號狀態(tài)(nonsignalstate)。這四種同步對象是:(1)事件對象(Event)。一個或多個線程可等待一個事件對象,當指定的事件發(fā)生時,事件對象通知等待線程可以開始執(zhí)行。(2)臨界區(qū)(Critical Section)。只有擁有那個對象的線程可以訪問保護資源。(3)互斥量(Mutex Semaphore)。(4)信號量(Semaphore)。它是通過計數器來實現的,初始化時賦予計數器以可用資源數,當將信號量提供給一個線程時,計數器的值減1,當一個線程釋放它時,計數器值加1。信號量是Windows98同步系統(tǒng)的核心。Windows/NT還提供了另外一種Windows95沒有的同步對象:可等待定時器(Waitable Timer)。這可以用于后臺任務。 在很多人印象中,單例模式可能是23個設計模式中最簡單的一個。本專題參考的資料如下: C++ Primer (Stanley ),主要參考的是模板靜態(tài)變量的初始化以及實例化。 Effective C++ 04條款(Scott Meyers) NonLocalStatic對象初始化順序以及Meyers 單例模式的實現。我們避免使用reset函數。 四人幫的經典之作:設計模式 windows 核心編程(Jeffrey Richter) 簡單工廠模式屬于類的創(chuàng)建型模式,又叫做靜態(tài)工廠方法模式。(Creator)角色簡單工廠模式的核心,它負責實現創(chuàng)建所有實例的內部邏輯。(Product)角色簡單工廠模式所創(chuàng)建的所有對象的父類,它負責描述所有實例所共有的公共接口。它包含必要的判斷邏輯,能夠根據外界給定的信息,決定究竟應該創(chuàng)建哪個具體類的對象。有利于整個軟件體系結構的優(yōu)化。另外,當系統(tǒng)中的具體產品類不斷增多時,可能會出現要求工廠類也要做相應的修改,擴展性并不很好。//思想: 核心思想是用一個工廠,來根據輸入的條件產生不同的類,然后根據不同類的virtual函數得到不同的結果。protected:private:}。 }protected:private:}。 }protected:private:}。 if (strcmp(name, pear) == 0) { tmp = new Pear()。 } else { return NULL。 }protected:private:}。 if (pear == NULL) { cout創(chuàng)建pear失敗\n。 Fruit *banana = Factory::Create(banana)。 system(pause)。新添加類時,不會影響以前的系統(tǒng)代碼。  GOOD:適用于不同情況創(chuàng)建不同的類時BUG:客戶端必須要知道基類和工廠類,耦合性差(工廠類與基類為關聯關系)include iostreamusing namespace std。 int second。private:}。 }private:}。 }private:}。 switch(cOperator) { case 39。: tmp = new AddOperation()。 case 39。: tmp = new SubOperation()。 default: tmp = NULL。 }}。+39。 op1first = 10。 coutop1GetResult()endl。39。 op2first = 10。 coutop2GetResult()endl。 system(pause)。工廠方法模式的意義是定義一個創(chuàng)建產品對象的工廠接口,將實際創(chuàng)建工作推遲到子類當中。抽象工廠(Creator)角色工廠方法模式的核心,任何工廠類都必須實現這個接口。抽象(Product)角色 工廠方法模式所創(chuàng)建的所有對象的父類,它負責描述所有實例所共有的公共接口。工廠方法類的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。當系統(tǒng)擴展需要添加新的產品對象時,僅僅需要添加一個具體對象以及一個具體工廠對象,原有工廠對象不需要進行任何修改,也不需要修改客戶端,很好的符合了“開放-封閉”原則。工廠方法模式退化后可以演變成簡單工廠模式。include iostreamusing namespace std。 }}。 }}。 }}。 }}。 }}。 }}。 Fruit *fruit = NULL。 fruit = ffgetFruit()。 delete fruit。 //2蘋果 ff = new AppleFactory()。 fruitsayname()。 delete ff。 system(pause)。抽象工廠模式可以向客戶端提供一個接口,使得客戶端在不必指定產品的具體類
點擊復制文檔內容
環(huán)評公示相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1