什麼是單例模式?
顧名思義,就是只有乙個例項,也就是說乙個應用程式中只有乙個例項物件.
既然乙個系統,乙個應用程式中只有乙個例項,那麼也就說明了如果操作這乙個物件,必然涉及到共享資源,涉及到資源分配問題,資源競爭等問題.
那麼我們的應用場景是什麼呢?
2. 池化技術. 比如資料庫的連線池. 每個資料庫的可支援的連線數量是有限,而且連線物件建立和銷毀也是比較耗記憶體的. 通過乙個統一的入口去控制,可以保證對資料庫的壓力在可控的範圍內,同是也可以保證出具庫連線的持續使用.
3. 配置中心. 乙個應用程式針對通過乙個配置檔案的載入只需要載入一次即可,不需要多次載入.
其實以上只是一些常見的應用場景,當然單例模式的應用場景也遠不止於此.
本文參考的部落格位址為:
接下來我們來看一下常見的實現方式,以及其中的對比.
餓漢式,即直接初始化好,使用的時候直接呼叫即可.
package com.cbl.design.singletondesign;public class hungrysingleton
//向外提供獲取示例的靜態方法
public static hungrysingleton getinstance()
}
懶漢式, 顧名思義,就是懶,需要的時候再去初始化
package com.cbl.design.singletondesign;public class lazysingleton
public static lazysingleton getsingleton() }}
return singleton;
}}
靜態內部類的方式
package com.cbl.design.singletondesign;public class staticinnersingleton
private staticinnersingleton()
public static staticinnersingleton getsingleton()
private string name;
public void desc()
}
還有一種實現方式是依賴於列舉, 我們知道列舉中的物件是例項化好的,而且列舉天生要求列舉類的構造器必須私有,而且本身還是被final 修飾的, 不可被繼承
package com.cbl.design.singletondesign;public enum enumsingleton
public static void process()
private string name;
private integer age;
public string getname()
public void setname(string name)
public integer getage()
public void setage(integer age)
}
以上是4中常見的構造單例模式的四種執行緒安全的構造單例的設計模式.網上可能還有其餘的非執行緒安全的構建單例的方法, 但是執行緒安全的主要就是這四種.
(1) : 餓漢式 : 載入類的時候就會進行例項化,,如果後續沒有用到,則會搞成資源浪費.
(2) : 懶漢式 : 使用的時候再去初始化,這樣在前幾次呼叫併發呼叫的時候,會出現資源競爭, 等待時間較久,但是後續再次呼叫的時候, 由於是雙重判斷加加鎖校驗機制, 不會出現阻塞.
(3): 靜態內部類 : 也是在使用的時候再去載入內部類並初始化外部類的物件,第一次呼叫會比較慢.
(4):列舉單例: 類載入的時候就穿建立好物件了, 特點和餓漢式很像.
上面是這幾種單例方式的特點,其中懶漢式,餓漢式,靜態內部類的方式都不能防止反射,只有列舉類可以防止反射.
但是一般我們的應用程式只需要保證可以正常實現單例即可,沒必要過多的去防止單例模式,我們使用單例模式,就是想構造單例物件的,但是我們自己又去使用反射去破壞單例模式,這不是自己給自己找麻煩嗎.
設計模式之單例模式,學習筆記
所謂的單例模式就是說乙個物件,我們只去例項化一次,在頁面中如果有乙個物件是唯一的,那麼就可以用單例模式。var fn function name fn.prototype.getname function fn.getinstrace function var a fn.getinstrace js...
設計模式之單例學習筆記
使用場景 當使用乙個類會消耗很大的系統資源時,沒有必要去建立多個物件,這時候我們就應該使用單例模式。而為了使建立的物件有且只有乙個,類的構造方法應該是私有的,且獲取例項的方法應該是執行緒安全的。單例的幾種實現方式 1.餓漢模式 public class test public static test...
設計模式筆記之 單例模式
那麼單例的建立方式有4中 其實是5種,只不過有一種因為不推薦使用,就不學習了 這種寫法分類來自尚學堂的老師。這個寫法是類在初始化就已經完成單例的建立的,不可以延遲操作 package singlepattern 這是類初始化就馬上載入,惡漢 author cloudhuan public class...