設計模式4 單例模式

2021-06-23 09:06:44 字數 2142 閱讀 7637

保證乙個類僅有乙個例項,並提供乙個訪問他的全域性訪問點。

所有類都有構造方法,假如不對他進行編碼,系統會生成空的public

的構造方法,外部類就能建立這個類的物件。為了不讓其他類能new出這個類的例項,所以需要寫乙個private

的構造方法(其實即使使用private修飾,通過反射機制還是能在外部呼叫的)。然後再提供乙個返回該類例項的函式供外部呼叫。

當乙個事物只能出現乙個例項的時候,我們就能用到他,舉例。

當乙個系統只能出現乙個控制類的時候;當乙個系統只能有乙個資料庫連線池的時候;資源管理器只能有乙個例項;

根據單例模式的定義,寫出了乙個原型,如下:

public class singleton1 

public static singleton1 getinstance()

return sinstance;

}}

上面**有乙個問題,沒有考慮執行緒安全的問題。假如在多執行緒使用這個單例,多個執行緒可能同時執行到判斷是否為空的**。假如第一次執行,物件就是空的,所以多個執行緒就同時進入了if語句,然後同時執行建立例項的**。

針對上面執行緒安全的問題,很容易就想到了鎖,於是乎,**程式設計下面這樣:

public class singleton2 

public static singleton2 getinstance()

} return sinstance;

}}

第2份**有乙個問題,假如多個執行緒同時通過了是否為空的判斷,他們仍然會序列的執行建立例項的**。所以我們還得改,於是又想到把同步的範圍擴大,如下面**:

public static singleton3 getinstance() 

} return sinstance;

}

這樣處理的話,每次呼叫getinstance()

函式都需要執行一次同步,同步鎖是很耗時的,所以每次呼叫這個函式耗時都會很長,降低了效能。我們要做到的是第一次呼叫的時候,避免多次建立,所以,我們可以用雙重鎖來處理這個。

public class singleton3 

public static singleton3 getinstance()

}} return sinstance;

}}

對於序列化功能的支援,防止序列化前後的不一致,我們作如下處理。

public object readresolve()

根據以上的分析和優化,我們得到了乙個基本符合要求的單例模式的**。單例模式有常用的兩種寫法「懶漢式」和「餓漢式」,下面是「懶漢式」:

public class singletonl 

public static singletonl getinstance()

}} return sinstance;

} public object readresolve()

}

下面的是「餓漢式」寫法:

public class singletone 

public static singletone getinstance()

public object readresolve()

}

「懶漢式」顧名思義,我比較懶,我要的時候你就要給我,所以建立例項是在getinstance()函式裡面。

「餓漢式」表明我很餓,所以你需要立刻給我,於是在申明的時候就需要建立例項。

下面我們來看看如何呼叫:

singletone singletone = singletone.getinstance();

singletone.print();

singletonl singletonl = singletonl.getinstance();

singletonl.print();

這一篇本是3

個月前寫好的,結果一晃乙個季度過去了卻還未修改發布。執行力不夠,容易被瑣碎的事情給耗盡了……

嗯,進步空間還是非常大滴!

設計模式 4 單例模式

單例模式屬於建立型的設計模式,其特點是在於保證乙個類只會被例項化一次,可以作為全域性唯一資源提供給系統。此處通過判斷兩個例項的位址是否一致來驗證單例模式,中包含了保證多執行緒安全的單例模式實現。由於python下的懶漢單例模式實現本人覺得是不可能的,因此下面使用了double check的方式實現了...

設計模式 4 單例模式

單例模式用來確保乙個類只有乙個例項,並提供乙個全域性訪問點。在所有的設計模式中,單例模式是最簡單也是最常用的一種設計模式,它只為乙個例項提供乙個全域性物件,內次嘗試去獲取乙個類的例項的時候,保證獲取到的都是這乙個物件。下面是關於單例模式中的一些小概念 餓漢式和懶漢式區別 餓漢就是類一旦載入,就把單例...

設計模式 4 單例模式

應用最廣的模式 單例模式。1 餓漢模式,僅下面 時,效果是懶載入的,如果這個類中有其他靜態域x,對x引用會載入類,還有就是使用掃瞄型別進行反射使用也會載入類 author cheng description 餓漢式,執行緒安全 since 2020 9 7 20 26 public class si...