單例模式SingletonPattern

2021-08-04 01:29:23 字數 1767 閱讀 5421

單例模式使用的前提:

單例模式簡單易用,但是也是所有設計模式中最容易濫用的模式。當你的類想得到很好的擴充套件時,不能使用單例模式

作用:首先要說明的是,在一些情況下使用單例模式是可以達到節省資源的目的,但是單例模式的意圖不只是為了節省

資源。如.

果僅僅為了節省資源

就使用單例模式的話可能造成單例模式的濫用。

2)單例模式是為了確保在整個應用期間只有乙個例項,以達到使用者的特定的使用目的

型別:單例模式分為餓漢式 和 懶漢式 兩中

單例模式弊端: 1)

擴充套件困難

,由於getinstance靜態函式沒有辦法生成子類的例項。如果要拓展,只有重寫那個類。 2)

隱式使用引起類結構不清晰

。比如有時候,你並不知道某個類a是單例類,當你讀類b的時候,你可能先看它標頭檔案,

或者類檢視裡的內容,從這裡你無法知道a和b 關係,因為b類在實現的時候才使用a類的那個所謂的getinstance函式,

讀不到這行,你就會知道b類對a類的依賴關係。

3)導致程式記憶體洩露的問題

。很多人只是呼叫了getinstance生成唯一的例項,卻永遠new被封裝在getinstance裡忘了去釋放記憶體。

創造方法:

1.餓漢式

1)建立具有本類返回型別的靜態私有物件,並手動初始化

2)建立私有的建構函式;

3)構造公共的靜態方法(該方法返回型別是本類型別),返回例項化的物件

優點:

餓漢式每次呼叫的時候不用做建立,直接返回已經建立好的例項

弊端:當類被載入的時候,該類就對靜態的類物件進行了初始化,從此物件一直存在記憶體,這樣當對

象未被呼叫時,例項就一直處於閒置狀態,這樣造成了資源了的浪費,記憶體占用比較嚴重

public class domain }

class hungersingleton

public static hungersingleton   getinstance() }

2.懶漢式

1)建立具有本類返回型別的靜態私有物件,不會手動初始化

2)建立私有的建構函式;

3)構造公共的靜態方法(該方法返回型別是本類型別),

如果物件已經建立,返回例項化的物件

如果物件不存在,怎建立物件並返回

優點:物件只有在被呼叫時才進行初始化,不被使用時候是不會初始化的,這樣節省了記憶體空間

弊端:在併發的情況下,懶漢式是不安全的。

如果兩個執行緒,我們稱它們為執行緒1和執行緒2,在同一時間調

用getinstance()方法,如果執行緒1先進入if塊,然後執行緒2進行控制,那麼就會有兩個例項被建立。

public class domain }

class lazysingleton

public static getinstance()

return instance; }

} 難點解釋:

private

static hungersingleton instance

1.為什麼使用private 

這裡是用來控制訪問許可權的,防止在外部對內的 instance 進行隨意的賦值 :例如:hungersingleton.instance=null;

2.為什麼使用static

實現在載入類的時候就對物件載入,也是為了在靜態方法public static 

hungersingleton 

getinstance(){}可以使用

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...

單例 單例模式

簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...

單例模式 懶漢式單例模式

單例模式有餓漢時模式和懶漢式 單例模式也就是說同一類只返回乙個物件供外部類使用 懶漢式即延遲初始化單例。在多執行緒環境下,簡單的懶漢式會有執行緒安全。懶漢式單例模式解決線性安全問題如下 1 使用雙重檢查鎖機制解決執行緒安全問題。2 單例模式還有更好的解決方案,即使用靜態類方式。懶漢式單例模式典型 p...