最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

單例設(shè)計模式--懶漢式和餓漢式

2023-07-13 19:24 作者:墨雪晨澗  | 我要投稿

?1 單例設(shè)計模式

????????單例設(shè)計模式是一種創(chuàng)建對象的軟件設(shè)計模式。在單例模式中,只允許存在一個類的實例,并提供一個全局訪問點來獲取該實例。

1.1單例模式的特點

單例模式的特點包括:

????????1. 私有構(gòu)造函數(shù):單例類的構(gòu)造函數(shù)被設(shè)置為私有,這樣外部無法直接實例化該類。

????????2 . 靜態(tài)實例變量:單例類擁有一個靜態(tài)變量,用于保存類的唯一實例。

????????3. 靜態(tài)獲取方法:提供一個公共的靜態(tài)方法,用于獲取單例實例。該方法通常命名為getInstance()。

????????以下是一個基于懶漢式的單例模式的示例代碼:

????????在上面的示例中,`Singleton`類的構(gòu)造函數(shù)被設(shè)置為私有,這意味著只能在類內(nèi)部訪問。`getInstance()`方法用于獲取`Singleton`類的唯一實例。如果實例尚未創(chuàng)建,則在第一次調(diào)用`getInstance()`時創(chuàng)建實例;否則,直接返回已經(jīng)創(chuàng)建的實例。

????????使用單例模式的好處包括

????????1. 確保類只有一個實例,節(jié)省內(nèi)存和系統(tǒng)資源。

????????2. 提供對唯一實例的全局訪問點,方便在應(yīng)用程序中使用該實例。

1.2單例模式也有一些限制和注意事項

????????1 單例模式可能會致代碼的可測試性下降,因為很難在單元測試中替換實例。

????????2. 單模式容易被濫用,如果在設(shè)計時不恰當(dāng)使用,可能會導(dǎo)致程序的耦合性增加。

????????3. 在多線程環(huán)境下,需要注意實例的并發(fā)訪問問題,確保線程全性。 總之,單例模式在需要保證只有一個實例存在的場景中具有很好的適用性和實用性。

????????如何更好理解單例設(shè)計模式?

????????讓我們以一個生活中的例子來幫助理解單例設(shè)計模式。

????????假設(shè)你是一個圖書館的管理員,你負(fù)責(zé)管理圖書館的圖書資源。為了方便讀者借閱圖書,你需要確保圖書館只有一個圖書管理員,而不是每個讀者都有一個專屬的圖書管理員。 在這個例子中,單例設(shè)計模式可以被類比為圖書館的管理員。圖書館管理員的類(`LibraryManager`)只允許存在一個實例,就像單例模式中只允許存在一個類的實例。管理員類的構(gòu)造函數(shù)是私有的,使得其他對象無法直接實例化管理員。通過提供一個靜態(tài)的`getInstance()`方法,其他對象可以通過該方法獲取管理員的唯一實例。


????????這樣,每個讀者都通過`LibraryManager.getInstance()`方法獲取到相同的管理員實例,實現(xiàn)了圖書館只有一個管理員的要求。讀者可以與管理員交互,借閱和歸還圖書,而不需要為每個讀者都創(chuàng)建一個獨立的管理員對象。 這個比喻幫助我們理解單例設(shè)計模式中的概念:只有一個實例存在,全局訪問點可以獲取該實例。無論在圖書館還是在軟件開發(fā)中,單例模式都能夠提供便捷和資源管理的好處。


? ? ? ? 什么時候使用到單例設(shè)計模式?

????????當(dāng)你需要確保系統(tǒng)中只有一個實例存在,并且需要對該實例進(jìn)行全局訪問時,可以考慮使用例設(shè)計模式。

????????讓我們依然以生活中的例子來說明。假設(shè)你是一個班級的班長,負(fù)責(zé)管理班級事務(wù)。在班級中,你需要確保只有一個班長存在,并且大家都可以方便地找到。這時候,單例設(shè)計模式就非常適用。 首先,在該班級中只有一個實例,就像例設(shè)計模式只有一個類的實例。其次,你的構(gòu)造函數(shù)是私有的,同學(xué)無法直接選為班長。最后,你提供了全局的訪問方法,比如一個箱子,面放著你的名片每個同學(xué)都可以從箱子里取出你的名片,得到你的聯(lián)系方式。

????????通過個例子,我們可以加生動地理解么時候需要用到單例設(shè)計模式:

????????1. 當(dāng)你的系統(tǒng)或應(yīng)程序需要確保只一個實例存在時,比如數(shù)據(jù)庫連接池、程池等。這樣可以避免因為頻繁地創(chuàng)建和銷毀實例而造成的能損耗。

????????2. 當(dāng)你的系統(tǒng)應(yīng)用程序需要提供全局訪問點,讓其他對象可以便地獲取到該實例。比如日志器、配置管理器等。這樣可以方便地使用該實例,而不需要在不同的對象之間傳遞實例。

????????3. 當(dāng)你需要控制一個類的實例化過程,限制實例的數(shù)量只創(chuàng)建一個實例時,比如線程池計數(shù)器等。這樣可以確保全局唯性,避免出現(xiàn)不一致的情況。

???????? 總之,單例設(shè)計模式在需要確保只有一個實例存在,并提供全局訪問的場景下非常有用。類比生活中的例子,可以幫助我們更好地理解和應(yīng)用單例模式。

2 懶漢式和餓漢式

懶漢式和餓漢式都是單例設(shè)計模式的實現(xiàn)方式,主要用來保證一個類只有一個實例,并提供一個全局訪問點。

2.1?懶漢式(Lazy Initialization):

懶漢式是在需要獲取實例時才進(jìn)行初始化,即延遲加載。在多線程環(huán)境下需要注意線程安全性。

簡單實現(xiàn)示例:

在上面的代碼中,當(dāng)調(diào)用 `getInstance()` 方法時才會創(chuàng)建實例,如果實例還未被創(chuàng)建,則進(jìn)行初始化。使用`synchronized`關(guān)鍵字修飾的方法確保了在多線程環(huán)境下的線程安全性。但是這種方式在高并發(fā)環(huán)境下可能引起性能問題。

2.2?餓漢式(Eager Initialization):

餓漢式是在類加載時就進(jìn)行初始化,即立即加載。在多線程環(huán)境下不需要考慮線程安全性。

簡單實現(xiàn)示例:

在上面的代碼中,實例在類加載時就被創(chuàng)建并初始化,可以保證實例的唯一性。由于實例的創(chuàng)建發(fā)生在類加載過程中,所以不存在多線程環(huán)境下的線程安全問題。但是如果這個實例較為龐大且初始化比較耗時,可能會導(dǎo)致類加載過程變慢。

3 為什么懶漢式存在線程問題?

懶漢式存在線程安全問題是因為在多線程環(huán)境下,可能出現(xiàn)多個線程同時判斷實例為null的情況,從而導(dǎo)致多個實被創(chuàng)建。

具體來說,當(dāng)多個線程同時調(diào)用懶式的getInstance()方法時,如果實例還未被創(chuàng)建,所有的線程都會通過實例為null的判斷條件,并進(jìn)行實例的創(chuàng)建操作。這是由于多線程境下,多個線程可以同時入到判斷條件的代碼塊中。這就會導(dǎo)多個實例被創(chuàng)建,違背了單例設(shè)計模式的原則。

解決懶漢式線程安全問題的方法有幾種,常見的有兩種:

????1.使用synchronized關(guān)鍵字修飾getInstance()方法,將其變?yōu)橥椒椒?,確保在同一只有一個線程可以進(jìn)入該方法:

這種方式可以保證線程安全性,但會引入性能問題,因為每次調(diào)用getInstance()方法時都需要進(jìn)行同步。

????2.使用雙重檢查鎖(Double-Checked Locking)的方式,在只有實例未被創(chuàng)建的況下才進(jìn)行同步操作,避免了每次調(diào)用方法都同步:

種方式只有在實例未被創(chuàng)建時才進(jìn)行鎖定和實例的創(chuàng)建操作,避免了多次同步,提高了性能。但需要注意使用volatile關(guān)鍵字修飾實例,確保可見性和止指令重排序,以避免潛在的問題。


需要注意的是,從 5開始,雙重檢查鎖的方式可以常工作,因為在Java 5及之后版本中修復(fù)了volatile關(guān)鍵字和鎖的語義問題。但在Java 5之前的版本中,雙重檢查鎖可能會導(dǎo)致失效。因此,在Java 5以前的版本中,建議使用第一種方式(synchronized關(guān)字)實現(xiàn)線程全的懶漢式單。



總結(jié): 懶漢式需要獲取實例時才進(jìn)行初始化,適用于實例創(chuàng)建較為耗時且需要延遲加載的情況,但需要注意多線程環(huán)境下的線程安全性。 餓漢式在類加載時就進(jìn)行初始化,適用于實例創(chuàng)建較為簡單且不需要延遲加載的情況,且不存在多線程環(huán)境下的線程安全問題。




單例設(shè)計模式--懶漢式和餓漢式的評論 (共 條)

分享到微博請遵守國家法律
清流县| 同江市| 即墨市| 乐东| 营口市| 日土县| 贵定县| 四子王旗| 茶陵县| 丰都县| 甘肃省| 乌苏市| 武安市| 山西省| 乐东| 思南县| 芒康县| 云林县| 达尔| 甘肃省| 如皋市| 永州市| 华宁县| 马山县| 和顺县| 广河县| 远安县| 天柱县| 内黄县| 古交市| 莱州市| 嘉祥县| 余干县| 祁东县| 开封县| 宣城市| 夏津县| 天长市| 原平市| 南江县| 昔阳县|