設計模式 建立模式 單例 C 描述

2021-08-19 08:54:23 字數 2503 閱讀 5670

second60 20180425

單例是23種設計模式中最常用的,沒有之一。

一句話,單例就是乙個全域性變數(物件)。在整個程式生命週期,只有乙個例項。

單例的實現很簡單。

在c++中,用

static

函式和static

變數來實現或用模來來繼承。

class singleton

private:

static singleton* _instance;

singleton(){} // 不能被外面例項化

~singleton(){}

};singleton* singleton::_instance() = 0;

使用:singleton::instance();

class singleton

private:

singleton(){}

~singleton(){}

};使用:

singleton::instance();

class singleton

private:

singleton(){}

~singleton(){}

};使用:

singleton::instance();

template

class singleton

private:static t* m_pinstance;  

singleton(const singleton& src){}  

singleton &operator=(const singleton& src){};  

protected:  

//使繼承者無法

public

建構函式和析構函式  

singleton(){}  

~singleton(){}

public:  

static t* getinstance()  

if (m_pinstance == null)  //判斷是否第一次呼叫  

m_pinstance = new t();  

return m_pinstance;  

template

t* singleton::m_pinstance = null;

使用方法:

class a : public singleton{};

上面給出四種簡單單例,很多種吧~~你是否還能想到更多的。使用看個人喜歡,我比較喜歡使用第二三種,因為化碼量會少很多。第四種模版類,在大系統架構時用的比較多。

網上很多說法:

飢餓模式的單例:程式啟動時就例項化

懶漢模式的單例:呼叫時再例項化單例

優點:都提供了全域性唯一的實現,實現了全域性類。

缺點:上面四種只是例項了單了,但是並沒有處理多執行緒中的問題,是執行緒不安全的,多個執行緒呼叫,初始化物件可能會呼叫多次

怎麼做到執行緒安全呢?當然是加鎖了,所以又提出了雙重檢查鎖機制,即在建立單例物件時,兩次判斷加鎖。

class singleton

public:

static singleton* getinstance();

};singleton* singleton::getinstance()

unlock();

}return m_instance;

}class singleton

public:

static singleton* instance()

};class singleton

public:

static const singleton* getinstance()

};const singleton* singleton::m_instance = new singleton;

關於執行緒安全,其實最主要是因為建立時,多個執行緒可能會同時例項化類,所以採用了鎖機制,在第乙個執行緒進入例項化時,加鎖,建立後釋放。

所以採用餓漢模式,是不會有上面的建立問題,因為餓漢模式在程式啟動時已建立,所以在效能要求比較高時,避免頻繁加鎖,造成開銷大。

當然,如果是關係到單例類內部成員的同步問題,還是需要加鎖滴。因為資料才能同步。不會兩個執行緒拿到單例後,交叉更改資料造成不同步。

單例是運用的最廣泛的設計模式,說說運用的場景:

a) 公共配置,如果整個程式只有乙份的配置,通常都是單例

b) 工具類,如果是乙個工具類,通常也是用單例或static方法

c) 公共資料,整個程式只有乙份資料,通常用單例來維護

d) 全域性變數

e) 所有想程式生命週期只有乙個例項的類

單例,平時用的最多了,不總結還不知道,一總結嚇一跳,其實單例的實現方法很多,如果在單執行緒中,是不用考慮執行緒安全的;但如果是在多執行緒中,需要考慮下多執行緒安全的問題,如雙重檢查機制或餓漢模式,看運用場景。

快下班了,今天又貢獻了一篇,開開心心分享!

設計模式(一)單例模式 建立模式

先聊一下關於設計的幾個原則 設計模式 1 單例模式 建立模式 注意事項 1.允許子類派生 2.不要實現 icloneable 介面 這個介面繼承後可能會導致生成多個示例,違背了模式的原本意思 3.不要序列化 理由同上 4.不要再多執行緒下使用,如果需要再多執行緒下使用的話見下面舉例 單利模式作用 1...

設計模式 建立模式 抽象工廠 C 描述

second60 20180425 在我理解,抽象工廠其實是工廠模式的公升級版,不同之處是 工廠模式是對一類物件的建立,而抽象工廠是對多類物件的建立。工廠模版只是處理一類物件建立 抽象工廠能對多類物件的建立 圖中可以看出,相比公升級版權的工廠模式,此模式多了,不同的抽象產品,工廠即可以建立absta...

設計模式C 描述 單例與多例模式

設計模式c 描述 單例與多例模式 作為物件的建立模式,單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。單例模式有以下特點 單例類只能有乙個例項。單例類必須自己建立自己的唯一例項。單例類必須給所有其他物件提供這一例項。乙個典型的單例類的實現如下所示 其中構造...