開發者模式之 單例模式

2021-08-10 17:00:42 字數 2543 閱讀 7855

—前序:本文為《androdi原始碼及開發模式》的學習筆記。

定義:

確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。

使用情景:
確保某個類有且只有乙個物件的情景,避免每次使用都重複建立物件,而消耗過多資源。例如,建立乙個物件需要消耗的資源過多,如要訪問io或資料庫資源,這是就要考慮單例模式。

詳細介紹:
通過將單例類的建構函式私有化,使得客戶端**不能通過new的形式手動構造單例類的物件。單例類會暴露乙個公有的靜態方法,客戶端需要呼叫這個這個靜態方法獲取到單例類的唯一物件嗎,在獲取到這個單例物件的過程中需要確保執行緒安全,也就是在多執行緒的環境下構造單例類的物件也是有且只有乙個,這也是單例模式中最困難的地方。

關鍵點:

建構函式不對外開放,一般為private;

通過乙個靜態方法或者列舉返回單例類物件;

確保單例類的物件有且只有乙個,尤其是在多執行緒的環境下;

確保單例類物件在反序列化時不會重新構造物件。

uml圖:

單例模式的寫法一般有以下幾種:

第一種、最普通的單例模式(餓漢模式):

在類載入時就進行初始化,不管方法有沒有被呼叫。

public

class singleton1

public singleton1 getinstance()

}

第二種:懶漢模式:

利用synchronize 進行同步,在getinstance第一次呼叫時進行初始化,在多執行緒下利用synchronize保證單例物件的唯一性,但是這樣每次執行都會執行進行同步,消耗不必要的資源

優點:單例只有使用時才會被例項化,在一定程度上節約了資源

缺點:第一次載入時需要及時地進行例項化,反應相當稍慢,最大的問題是每次呼叫getinstance都進行同步,造成不必要的開銷。

*這種模式不建議使用!

public

class singleton2

public

static synchronized singleton2 getinstance()

}

第三種:double check lock(dcl)雙重判空實現單例

對instance進行了兩次判空,第一次判空是為了避免不必要的同步,相當single2的懶漢模式的每次同步優化了很多, 第二次判空是為了在null的情況下建立例項,

* 優點:第一次執行getinstance時單例物件才被例項化,效率高

* 缺點:第一次載入時反應稍慢

public

class singleton3

public

static singleton3 getinstance()

}return singleton3;}}

第四種:靜態內部類單例模式

第一次載入singleton類時不會初始化singleton4,只有呼叫getinstance方法時才被初始化。這種方法不僅確保執行緒安全,也能夠保證單例物件的唯一性,

* 同時也延遲了單例的例項化,這是最推薦使用的單例模式實現方式

public

class singleton4

public

static singleton4 getinstance()

private

static

class singletonholder

}

第五種:列舉實現單例

預設列舉例項的建立是安全的,並且在任何情況下他都是乙個單例

public

enum singleton5

}

第六種:使用容器實現單例模式

在程式的初始,將多種單例型別注入到統一的管理中。這種方式使得我們可以管理多種型別的單例,在使用時可以通過統一的介面進行獲取操作,降低了使用者的使用成本,也對使用者隱藏了具體實現,降低了耦合度

public

class singletonmanager6

public

static

void

registerservice(string key, object instance)

public

static object getservice(string key)

}

1、由於單例模式在記憶體中只有乙個例項,減少了記憶體開支,特別是乙個物件需要頻繁的建立銷毀時,而且物件的建立和銷毀又無法優化,單例模式的優勢就會十分明顯。

2、避免對資源的多重占用,例如乙個寫檔案操作,由於只有乙個例項存在記憶體中,避免對用乙個資源檔案的同時寫操作。

3、單例模式可以在系統設定全域性的訪問點,優化和共享資源範圍。

Fabric Chaincode 開發者模式除錯

在fabric開發中,chaincode的測試是乙個令人比較頭疼的問題,一是由於實際情況中chaincode中的儲存和查詢是依賴於peer節點上的狀態資料庫的,所以無法在本地直接測試 二是由於chaincode是執行於容器中的,這導致我們很難獲取在 中列印的日誌。如果直接在實際開發環境中測試chai...

iOS開發之單例模式

單例模式是一種常用的軟體設計模式,在應用這個模式時,單例物件的類必須保證只有乙個例項存在。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。單例的實現步驟 1 重寫alloc...

iOS 開發之單例模式

單例就是工程中只初始化一次,節省記憶體空間,或者共享資源。例如在建立藍芽類,或者做wifi通訊時經常用到。也可以用來傳值。一下介紹兩種建立單例的方法 一,考慮執行緒安全的寫法 考慮執行緒安全的寫法 return modeltool物件 instancetype sharemodel return m...