設計模式之單例模式的懶漢式和餓漢式

2021-10-24 14:00:45 字數 2002 閱讀 5197

一.為什麼要用單例模式

為了節約資源,有時候需要確保系統中的某乙個類只有唯一乙個例項,當這乙個例項建成以後,無法在建立同型別的物件。

二.單例模式的特性,優缺點

特性:1.只能有乙個例項物件 2.該單例物件必須由單例類自行建立

3.單例類對外提供乙個訪問該單例的全域性訪問點

優點:1.可以保證記憶體只有乙個例項,減少記憶體開銷

2.可以避免資源的多佔,重複利用

3.單例設定全域性訪問點,可以優化共享資源的訪問

缺點:1.單例模式一般沒有介面,擴充套件困難,如要擴充套件,則除了修改原來的**,沒有第二種辦法,違背了開閉原則

2.在併發測試中,單例模式不利於**除錯,在除錯過程中,如果單例中的**沒有執行完,也不能模擬生成乙個物件

3.例模式的功能**通常寫在乙個類中,如果功能設計不合理,很容易違背單一職責原則

三.應用場景

1.需要平凡建立的一些類,使用單例可以降低系統記憶體壓力,減少gc

2.某類只要求生成乙個物件時,比如說身份證號,或者乙個班的班長

3.某類建立例項時占用資源比較多,耗時長,經常使用

某類需要頻繁的例項化,而建立的物件又被頻繁的銷毀的時候,比如多執行緒 5.頻繁訪問資料庫或檔案的物件

6.對於一些控制硬體級別的操作,或者從系統上講應是單一控制邏輯的操作,如果有多個例項操作,則系統會亂套

7.當物件需要被共享的場合,由於單例只允許建立乙個物件,共享該物件可以節省記憶體,並加快訪問速度,如web中的配置物件,資料庫的連線池

public

class

lazysingleton

//向外提供乙個靜態的公有函式,用於讓外部建立或獲取該靜態私有例項

public

static lazysingleton getsing()

//建立好物件之後返回,這樣外部就可以直接獲取了

return singleton;

}}

package com.yh.creator;

/** * 用懶漢式模擬產生a國當今**物件

*/public

class

testsingleton01

else}}

class

people

public

static people getpeople()

else

return people;

}public

void

getname()

}

以上**執行結果

生出了乙個寶寶

我是寶寶,我叫小明

已經有乙個寶寶了

我是寶寶,我叫小明

他們是同乙個人

class

hungrysingleton

//提供外界獲取物件的方法

public

static hungrysingleton hungrysingleton()

}

//餓漢式實現建立孫悟空

package com.yh.creator;

public

class

testsingleton02

else}}

class

bajie

//這段**是為了保證不被別人建立物件

public

static bajie getinstance()

public

void

getname()

}

執行結果:

孫悟空誕生了

孫悟空孫悟空

他們是同乙個人

1.餓漢式是在單例類的例項在jvm啟動時就建立好了,懶漢式則是在第一次訪問單例類的例項時才去建立,即可以把餓漢式看成是預載入,懶漢式則為延遲載入;

2.餓漢式的單例類例項由於是在jvm啟動時建立的,所以不用考慮多執行緒問題,懶漢式則需要進行同步(synchronized);

設計模式 單例模式之餓漢式和懶漢式

設計模式 通過大量的實踐和總結出來的優化的 結構,程式設計風格,以及解決問題的方式。單例設計模式 乙個類只能建立乙個例項。如何實現呢?以下4步。1 私有化構造器,為了是只能在類內部建立例項,而不能在類外建立例項。2 在類內部建立例項,私有化此例項。3 公有的方法呼叫此例項,通過類呼叫,因此設定為st...

設計模式 單例模式之餓漢式和懶漢式

單例模式可以分為懶漢式和餓漢式 餓漢式是執行緒安全的,無需關注多執行緒問題,它是在類載入時建立例項 懶漢式不是執行緒安全的,建立例項的時間與餓漢式相反是延時載入 餓漢式示例 public class test private static test test null public static s...

設計模式之單例模式 懶漢式和餓漢式

特點 建構函式私有化即不能再通過new進行例項化 唯一例項 優點 在記憶體裡只有乙個例項,減少記憶體開銷,尤其是頻繁的建立和銷毀例項 避免對資源的多重占用 檔案讀寫操作 缺點 沒有介面,不能繼承,與單一職責原則衝突,乙個類應該只關心內部邏輯,而不關心外部怎樣例項化 public class lazy...