保證乙個類僅有乙個例項,並提供乙個訪問他的全域性訪問點。
所有類都有構造方法,假如不對他進行編碼,系統會生成空的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...