設計模式之一 單例模式

2021-08-19 14:08:07 字數 1370 閱讀 5711

好久不寫部落格,最近都在複習,心血來潮,寫一篇關於設計模式--單例模式的部落格。。。。

我們知道,對於c++oop思想,我們怎麼可以說不熟悉設計模式,接下來就簡單地介紹一下單例模式。

在我們的設計當中經常要保證系統中,應用該模式的類乙個類只有乙個例項。即乙個類只有乙個物件例項。思考一下,什麼時候建構函式不能手動呼叫?答:自然是將建構函式私有化;再思考,建構函式私有化了,我們如何將我們的物件構造呢?答:提供乙個公有的介面;再思考,我們如何保證例項化一次呢?答:把成員變數(唯一的物件)定義為靜態變數,根據靜態變數的特點,一旦被賦值之後將不能再被賦值。所以我們初步的單例模式就出來了;如下:

版本一:

class singleton

return project;

}private:

singleton(){};

static singleton *project;

}版本二:

當我們考慮到執行緒安全的時候,我們的初步版本就不在適用了,試想一下,當我們乙個執行緒判斷了if語句成立,所以要進去構造object的時候,另乙個執行緒此時剛好構造完了object,那我們豈不是構造object兩次,所以考慮到執行緒安全問題,我們需要保證if語句裡面是臨界區,保證原子操作,所以我們加上互斥鎖來保證

class singleton

pthread_mutex_unlock(&mutex);

return project;

}private:

singleton(){};

static singleton *project;

}版本三:我們知道鎖是很重的,假如我們是單執行緒和多執行緒共存,那我們每次都要加鎖解鎖豈不是很麻煩,所以我們在這裡加一層判斷,就是為了提高單執行緒訪問時的效率

class singleton

pthread_mutex_unlock(&mutex);

}    

return project;

}private:

singleton(){};

static singleton *project;

}版本四:考慮編譯器的指令優化和cpu的動態指令優化

volatile關鍵字阻止編譯器為了提高速度將乙個變數快取到暫存器內而不寫回記憶體

volatile關鍵字阻止編譯器調整操作volatile變數的指令操作

barrier指令會阻止cpu對指令進行動態換序優化

class singleton

pthread_mutex_lock(&mutex);

}return project;

}private:

singleton(){}

volatile static singleton *project;

};

設計模式之一單例模式

單例模式就是類別只有乙個例項,每次在必得類呼叫這個類的例項,都是同乙個例項。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。如印表機 顯示卡等等這些系統資源。如果做andr...

設計模式之一 單例模式

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項。定義乙個單例類,使用類的私有指標變數指向類的唯一例項,並且使用乙個共有的靜態方法獲取該例項。懶漢模式 即第一次呼叫該類的例項的時候才產生乙個新的該...

設計模式之一 單例模式

一.什麼是單例模式 某個類同時保留乙個物件,不希望有更多物件,此時,我們則應考慮單例模式的設計。二.單例模式的特點 1.單例模式只能有乙個例項。2.單例類必須建立自己的唯一例項。3.單例類必須向其他物件提供這一例項。三.單例模式vs靜態類 在知道了什麼是單例模式後,我想你一定會想到靜態類,既然只使用...