1. 程式人生 > >C++筆記(五) UML/設計模式(簡單工廠模式及工廠模式)

C++筆記(五) UML/設計模式(簡單工廠模式及工廠模式)

一、UML(統一建模語言)

  1. 模型:對問題的書面上的無歧義文字或圖形的描述,簡言之,模型是對現實的簡化。
  2. 建模:對現實系統進行適當的過濾,用適當的表現規則描述出簡介的模型問題。
  3. UML:是一種基於面向物件的視覺化建模語言。UML採用了一組形象畫的額圖形符號作為建模語言,使用這些符號可以形象的描述系統的各個方面。UML通過建立圖形之間的各種關係來描述模型。
  4. UML建模工具:Rose,用的比較少;用例圖,常用
  5. 用例圖:也稱為使用者模型圖,是從軟體需求分析到最終實現的第一步,他是從客戶的角度來描述系統功能。包含三個基本元件:參與者(Actor)、用例(use case)、關係。參與者:與系統打交道的人或者其他系統,即使用該系統的人或事物;用例:代表系統的某香港完整的功能;關係:定義用例之間的關係;

二、設計模式

 程式的併發執行往往帶來與時間有關的錯誤,甚至引發災難性的後果。這需要
引入同步機制。使用多程序與多執行緒時,有時需要協同兩種或多種動作,此過程就
稱同步(Synchronization)。引入同步機制的第一個原因是為了控制執行緒之間的資源
同步訪問,因為多個執行緒在共享資源時如果發生訪問衝突通常會帶來不正確的後果。
例如,一個執行緒正在更新一個結構,同時另一個執行緒正試圖讀取同一個結構。結果,
我們將無法得知所讀取的資料是新的還是舊的,或者是二者的混合。第二個原因是
有時要求確保執行緒之間的動作以指定的次序發生,如一個執行緒需要等待由另外一個
執行緒所引起的事件。
為了在多執行緒程式中解決同步問題,Windows提供了四種主要的同步物件,
每種物件相對於執行緒有兩種狀態——訊號狀態(signal state)和非訊號狀態(nonsignal
state)。當相關聯的同步物件處於訊號狀態時,執行緒可以執行(訪問共享資源),反
之必須等待。這四種同步物件是:
(1)事件物件(Event)。事件物件作為標誌線上程間傳遞訊號。一個或多個線
程可等待一個事件物件,當指定的事件發生時,事件物件通知等待執行緒可以開始執
行。它有兩種型別:自動重置(auto-reset)事件和手動重置(manual-reset)事件。
(2)臨界區(Critical Section)。臨界區物件通過提供一個程序內所有執行緒必須
共享的物件來控制執行緒。只有擁有那個物件的執行緒可以訪問保護資源。在另一個線
程可以訪問該資源之前,前一個執行緒必須釋放臨界區物件,以便新的執行緒可以索取
物件的訪問權。
(3)互斥量(Mutex Semaphore)。互斥量的工作方式非常類似於臨界區,只是
互斥量不僅保護一個程序內為多個執行緒使用的共享資源,而且還可以保護系統中兩
個或多個程序之間的的共享資源。
(4)訊號量(Semaphore)。訊號量可以允許一個或有限個執行緒訪問共享資源。
它是通過計數器來實現的,初始化時賦予計數器以可用資源數,當將訊號量提供給
一個執行緒時,計數器的值減1,當一個執行緒釋放它時,計數器值加1。當計數器值小
於等於0時,相應執行緒必須等待。訊號量是Windows98同步系統的核心。從本質上
講,互斥量是訊號量的一種特殊形式。
Windows/NT還提供了另外一種Windows95沒有的同步物件:可等待定時器
(Waitable Timer)。它可以封鎖執行緒的執行,直到到達某一具體時間。這可以用於
後臺任務。

  1. 懶漢式和餓漢式
    #include <iostream>
    using namespace std;
    
    class Singleton
    {
    private:
    	Singleton()
    	{
    		cout << "Singleton 建構函式執行" << endl;
    	}
    public :
    	static Singleton *getInstance()
    	{
    
    		/*懶漢式
    		if (m_psl == NULL)
    		{
    			m_psl = new Singleton;
    		}
    		*/
    		return m_psl;
    	}
    	static void freeInstance()
    	{
    		if (m_psl != NULL)
    		{
    			delete m_psl;
    			m_psl = NULL;
    
    		}
    	}
    private :
    	static Singleton *m_psl;
    };
    //餓漢式
    Singleton *Singleton::m_psl = new Singleton;
    
    //懶漢式:非執行緒安全;只有在呼叫的時候才new
    //餓漢式:縣城安全,,做一個全域性變數static,系統一啟動就new例項
    void  main()
    {
    	//懶漢式
    	Singleton *p1 = Singleton::getInstance();
    	//餓漢式
    	//Singleton::m_psl;
    	system("pause");
    	return ;
    }
  2. 程式併發機制擴充套件:

程式的併發執行往往帶來與時間有關的錯誤,甚至引發災難性的後果。這需要
引入同步機制。使用多程序與多執行緒時,有時需要協同兩種或多種動作,此過程就
稱同步(Synchronization)。引入同步機制的第一個原因是為了控制執行緒之間的資源
同步訪問,因為多個執行緒在共享資源時如果發生訪問衝突通常會帶來不正確的後果。
例如,一個執行緒正在更新一個結構,同時另一個執行緒正試圖讀取同一個結構。結果,
我們將無法得知所讀取的資料是新的還是舊的,或者是二者的混合。第二個原因是
有時要求確保執行緒之間的動作以指定的次序發生,如一個執行緒需要等待由另外一個
執行緒所引起的事件。
為了在多執行緒程式中解決同步問題,Windows提供了四種主要的同步物件,
每種物件相對於執行緒有兩種狀態——訊號狀態(signal state)和非訊號狀態(nonsignal
state)。當相關聯的同步物件處於訊號狀態時,執行緒可以執行(訪問共享資源),反
之必須等待。這四種同步物件是:
(1)事件物件(Event)。事件物件作為標誌線上程間傳遞訊號。一個或多個線
程可等待一個事件物件,當指定的事件發生時,事件物件通知等待執行緒可以開始執
行。它有兩種型別:自動重置(auto-reset)事件和手動重置(manual-reset)事件。
(2)臨界區(Critical Section)。臨界區物件通過提供一個程序內所有執行緒必須
共享的物件來控制執行緒。只有擁有那個物件的執行緒可以訪問保護資源。在另一個線
程可以訪問該資源之前,前一個執行緒必須釋放臨界區物件,以便新的執行緒可以索取
物件的訪問權。
(3)互斥量(Mutex Semaphore)。互斥量的工作方式非常類似於臨界區,只是
互斥量不僅保護一個程序內為多個執行緒使用的共享資源,而且還可以保護系統中兩
個或多個程序之間的的共享資源。
(4)訊號量(Semaphore)。訊號量可以允許一個或有限個執行緒訪問共享資源。
它是通過計數器來實現的,初始化時賦予計數器以可用資源數,當將訊號量提供給
一個執行緒時,計數器的值減1,當一個執行緒釋放它時,計數器值加1。當計數器值小
於等於0時,相應執行緒必須等待。訊號量是Windows98同步系統的核心。從本質上
講,互斥量是訊號量的一種特殊形式。
Windows/NT還提供了另外一種Windows95沒有的同步物件:可等待定時器
(Waitable Timer)。它可以封鎖執行緒的執行,直到到達某一具體時間。這可以用於
後臺任務。

 

呼叫方法 

 

  1. 簡單工廠模式---》在這個模式中,工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的資訊,決定究竟應該建立哪個具體類的物件。使用者在使用時可以直接根據工廠類去建立所需的例項,而無需瞭解這些物件是如何建立以及如何組織的。有利於整個軟體體系結構的優化。不難發現,簡單工廠模式的缺點也正體現在其工廠類上,由於工廠類集中了所有例項的建立邏輯,所以“高內聚”方面做的並不好。另外,當系統中的具體產品類不斷增多時,可能會出現要求工廠類也要做相應的修改,擴充套件性並不很好。
  2. 工廠模式:--->

    工廠方法模式同樣屬於類的建立型模式又被稱為多型工廠模式 。工廠方法模式的意義是定義一個建立產品物件的工廠介面,將實際建立工作推遲到子類當中。

    核心工廠類不再負責產品的建立,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。

抽象工廠(Creator)角色

工廠方法模式的核心,任何工廠類都必須實現這個介面。

具體工廠( Concrete  Creator)角色

具體工廠類是抽象工廠的一個實現,負責例項化產品物件。

抽象(Product)角色     

工廠方法模式所建立的所有物件的父類,它負責描述所有例項所共有的公共介面。

具體產品(Concrete Product)角色

工廠方法模式所建立的具體例項物件

 

呼叫方法及調價新類