現在網上到處是單例設計模式,都開玩笑說現在滿城盡是singleton,呵呵,我也拿出來了,因為我平時用到最多的就是單例設計模式吧,而且比較簡單,可以作為Java設計模式的入門篇吧。
SINGLETON—俺有6個漂亮的老婆,她們的老公都是我,我就是我們家裡的老公Sigleton,她們只要說道“老公”,都是指的同一個 人,那就是我(剛才做了個夢啦,哪有這麼好的事)
單例模式:單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例單例模式。單例模式只應在有真正的 “單一實例”的需求時才可使用。’‘————————–先引用下“從追MM談Java的23種設計模式”文章中的說法。
單例設計模式形式有4種,一般人只知道有兩種,懶漢式和餓漢式。
懶漢式(只有需要的時候才new出來,這裡要用synchronized方法或代碼塊同步,因為在多線程情況下,不同的人同時進來拿到的引用可能都是null,結果都去new了)
public class LazzSingleton{
private LazzSingleton lazzSingleton = null;
private LazzSingleton() {}//私有構造期 這個很重要啦,如果共有那麼外面就可以隨便new了,那麼我們寫這個單例意義就不大了,我發現公司老員工都寫public的了,大家要注意下!
public synchronized LazzSingleton getInstance(){
if(lazzSingleton==null){
lazzSingleton = new LazzSingleton ();
return lazzSingleton ;
}
return null;
}
}
用的時候就:LazzSingleton lazzSingleton = LazzSingleton.getInstance();
餓漢式(一來就new,拿的時候直接拿對象)
public class HungerSingleton{
private HungerSingleton hungerSingleton = new HungerSingleton ();
private HungerSingleton() {}//私有構造期
public HungerSingleton getInstance(){
return hungerSingleton ;
}
}
用的時候就:HungerSingleton singleton = HungerSingleton.getInstance();
還有一種和餓漢式差不多(Effective Java這本書中有),因為式靜態常量,當然內存中只有一個對象啦。
public class StaticFinalSingleton(){
public static final StaticFinalSingleton singleton= new StaticFinalSingleton();
private StaticFinalSingleton (){};//私有構造期
}
用的時候就:StaticFinalSingleton staticFinalSingleton = StaticFinalSingleton.staticFinalSingleton ;
最後一種我記不起來了,用的不多。(我有個壞習慣,嗯,比喜歡記筆記,而且記性不好,希望大家不要學我)
所以實現單例要點:1.私有化構造器(外部不能new),2.用對象名去引用屬性(第三種)或靜態方法(第一第二種);
應用場景(單例設計模式一般和工廠設計模式聯合起來用,等做factory工廠模式時再一起使用,很簡單)
如果你的系統中有要讀配置文件,那麼讀配置文件的類就可以用單例設計模式了。例子:
public class LoadProperties {
private static LoadProperties loadProperties = new LoadProperties();
private LoadProperties(){};
public static LoadPropertiesgetInstance(){
return loadProperties
}
/**
* 根據文件名、模塊名,從配置文件中取得菜單名
* @param model
* @param fileName
* @return
*/
public String[] getMenus(String model,String fileName){
//….
return null;
}
/**
* 根據文件名,讀取顯示風格
* @param fileName
* @return
*/
public String[] getStyle(String fileName){
//……
return null;
}
}
/**
* 根據文件名,用戶名,讀取用戶權限,<p>先判斷用戶級別,然後讀取其權限</p>
* @param fileName
* @param user
*/
public String[] getPrivileges(String filename,String username){
return null;
}
//……
}
接下來我們來做個實驗,檢驗到底是不是singleton單例,單線程下我們一眼就看的出來是,所以我們就在多線程下測試。
package org.javaer.code.pattern;
public class Singleton {
static LazzSingleton lazzSingleton1, lazzSingleton2;
static HungerSingleton hungerSingleton1, hungerSingleton2;
static StaticFinalSingleton staticFinalSingleton1, staticFinalSingleton2;
public static void main(String[] args) {
while (1 > 0) {
new Runnable() {
public void run() {
lazzSingleton1 = LazzSingleton.getInstance();