初夏小談 設計模式之單例模式

2021-09-13 10:47:22 字數 2646 閱讀 7260

所謂設計模式就是一種被反覆使用,被頻繁使用的**經驗的總結。設計模式的出現使得**更容易被理解,保證了**的可靠性。它讓**變得工程化。就如打仗用的兵書一樣(孫子兵法)。

單例模式就是乙個類只能建立乙個物件。這種模式可以確保乙個類只有乙個物件,不能再建立其它物件。並且會提供乙個可以訪問它的全域性訪問點。只要有程式需要就會呼叫它。它是共享的。

單例模式中包含兩種模式即:①餓漢模式②懶漢模式

插曲:餓漢模式太形象了,一聽就知道乙個餓鬼整天就想著吃,所以他不管去哪都會帶著自己碗筷。雖然這樣會增加麻煩。但他為了吃也是夠拼的哈哈。

1.可以類推過來餓漢模式就像上面說的那樣。它在程式一啟動就會建立物件,不管有沒有其它程式去用它。   

2.由於餓漢模式的點是:①:程式啟動就建立物件

②:只能建立乙個物件

3. 所以在設計這樣的類時要考慮:

①:要將物件例項化時加上static目的是在程式一啟動就會建立這個物件。

②:根據只能建立乙個物件的特點,我們就需要對建構函式和拷貝建構函式進行私有化,防止在類外建立物件。

③:一旦在裡面建立這個物件我們就需要給乙個介面來在外面使用這個物件。並且這個介面也得給成靜態的。因為靜態不受物件的限制,假如是普通模式,如果在外面呼叫的話就需要用物件來調,顯然這不可能。

class singleton

private:

//建構函式

singleton()

{} //拷貝建構函式

singleton(const singleton& s)

{} //賦值

singleton& operator=(const singleton& s)

{}private:

static singleton object;

};singleton singleton::object;

餓漢模式 在多執行緒高併發環境下頻繁使用物件的話,它可以避免資源競爭,提公升響應速度。

1.懶漢就是太懶了呵呵,每次吃飯時才去找碗筷並且上一次吃了飯都沒洗碗,洗了碗再去打飯。

2.懶漢模式就是在程式啟動時不建立物件,而在使用時才會去建立。

3.在建立懶漢模式的單例模式時,要注意:

①:不能在類外建立物件也就是封裝構造和拷貝

②:不能直接在程式一啟動建立物件,那可以建立乙個指向物件的指標提前準備著。

③:如果需要建立物件那麼該怎麼辦呢?還是需要乙個不依賴物件的介面來建立類物件

④:這個物件需要一直存在,並且需要時才建立,所以我們再堆上建立這個物件。

⑤:再堆上建立物件就需要釋放該空間。

class singleton

return object;

}private:

//將建構函式和拷貝建構函式私有

singleton()

{} singleton(const singleton& d)

{}private:

static singleton* object;

};singleton* singleton::object = nullptr;

在多執行緒下,①可能會在建立第乙個物件時該執行緒的時間片剛好用完,下乙個執行緒進來,這樣就會導致建立多個物件的問題。

加一把互斥鎖後,②會造成一種情況就是當第乙個執行緒建立物件後後面執行緒在呼叫會遇到互斥鎖會被迫停下來,很明顯已經有物件,還要等待這也顯然不合理。所以再加上判斷語句,如果已經有物件就不用阻塞直接呼叫物件。③:在何時釋放堆上的空間,顯然是最後乙個執行緒呼叫完畢。程式結束時,我們就在這個類中在定義乙個靜態類,當這個類結束時也就是程式結束時,在內部類中釋放堆上的空間。

class singleton

mutex.unlock();

} return object;

} //負責釋放物件空間:

class clear

}};private:

//將建構函式和拷貝建構函式私有

singleton()

{} singleton(const singleton& d)

{}private:

static singleton* volatile object;

//互斥鎖

static mutex mutex;

// static clear clear;

};singleton* volatile singleton::object = nullptr;

mutex singleton::mutex;

singleton::clear singleton::clear;

懶漢模式:①:執行緒不安全時就加鎖

②:只要乙個執行緒在獲取物件,所有的執行緒將會被阻塞,雙檢測,降低阻塞概率

③:如果編譯器對**進行指令重排,物件可能建立不完整可以使用voliate

④:.什麼時機釋放單例物件:保證所有執行緒都不用,在程式退出時

⑤:封裝內部類,在內部類的析構函式中釋放物件空間

珍&原始碼

設計模式簡談 單例模式

確保乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。既然只能有乙個例項 單例模式的主要作用是確保乙個類只能有乙個例項存在,那麼這個模式可以用在隨機數生成器,計數器,管理器等等工具類。或者如果某個類建立乙個新物件會消耗很多資源的話,我們也可以使用單例模式來減少資源的消耗。這裡我們使用c 作...

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...