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