什么是設(shè)計模式?
設(shè)計模式是在大量的實踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構(gòu)、編程風(fēng)格、以及解決問題的思考方式。設(shè)計模式免去我們自己再思考和摸索。就像是經(jīng)典的棋譜,不同的棋局,我們用不同的棋譜、“套路”。
經(jīng)典的設(shè)計模式共有23種。每個設(shè)計模式均是特定環(huán)境下特定問題的處理方法。
什么是單例設(shè)計模式?
就像它的名字一樣,只能存在一個對象實例,所以叫單例模式。
所謂類的單例設(shè)計模式,就是采取一定的方法保證在整個的軟件系統(tǒng)中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法。
實現(xiàn)思路
如果我們要讓類在一個虛擬機(jī)中只能產(chǎn)生一個對象,我們首先必須將類的構(gòu)造器的訪問權(quán)限設(shè)置為private
,這樣,就不能用new操作符在類的外部產(chǎn)生類的對象了,但在類內(nèi)部仍可以產(chǎn)生該類的對象。因為在類的外部開始還無法得到類的對象,只能調(diào)用該類的某個靜態(tài)方法
以返回類內(nèi)部創(chuàng)建的對象,靜態(tài)方法只能訪問類中的靜態(tài)成員變量,所以,指向類內(nèi)部產(chǎn)生的該類對象的變量也必須定義成靜態(tài)的
。
餓漢式
class Singleton {
// 1.私有化構(gòu)造器
private Singleton() {
}
// 2.內(nèi)部提供一個當(dāng)前類的實例
// 4.此實例也必須靜態(tài)化
private static Singleton single = new Singleton();
// 3.提供公共的靜態(tài)的方法,返回當(dāng)前類的對象
public static Singleton getInstance() {
return single;
}
}
懶漢式
class Singleton {
// 1.私有化構(gòu)造器
private Singleton() {
}
// 2.內(nèi)部提供一個當(dāng)前類的實例
// 4.此實例也必須靜態(tài)化
private static Singleton single;
// 3.提供公共的靜態(tài)的方法,返回當(dāng)前類的對象
public static Singleton getInstance() {
if(single == null) {
single = new Singleton();
}
return single;
}
}
兩種方式的對比
餓漢式:文章來源:http://www.zghlxwxcb.cn/news/detail-676727.html
- 特點:
立即加載
,即在使用類的時候已經(jīng)將對象創(chuàng)建完畢。 - 優(yōu)點:實現(xiàn)起來
簡單
;沒有多線程安全問題。 - 缺點:當(dāng)類被加載的時候,會初始化static的實例,靜態(tài)變量被創(chuàng)建并分配內(nèi)存空間,從這以后,這個static的實例便一直占著這塊內(nèi)存,直到類被卸載時,靜態(tài)變量被摧毀,并釋放所占有的內(nèi)存。因此在某些特定條件下會
耗費內(nèi)存
。
懶漢式:文章來源地址http://www.zghlxwxcb.cn/news/detail-676727.html
- 特點:
延遲加載
,即在調(diào)用靜態(tài)方法時實例才被創(chuàng)建。 - 優(yōu)點:實現(xiàn)起來比較簡單;當(dāng)類被加載的時候,static的實例未被創(chuàng)建并分配內(nèi)存空間,當(dāng)靜態(tài)方法第一次被調(diào)用時,初始化實例變量,并分配內(nèi)存,因此在某些特定條件下會
節(jié)約內(nèi)存
。 - 缺點:在多線程環(huán)境中,這種實現(xiàn)方法是完全錯誤的,
線程不安全
,根本不能保證單例的唯一性。
到了這里,關(guān)于Java——單例設(shè)計模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!