單件模式用途:
單件模式屬於工廠模式的特例,只是它不需要輸入參數並且始終返回同一對象的引用。
單件模式能夠保證某一類型對象在系統中的唯一性,即某類在系統中只有一個實例。它的用途十分廣泛,打個比方,我們開發了一個簡單的留言板,用戶的每一次留言都要將留言信息寫入到數據庫中,最直觀的方法是沒次寫入都建立一個數據庫的鏈接。這是個簡單的方法,在不考慮並發的時候這也是個不錯的選擇。但實際上,一個網站是並發的,並且有可能是存在大量並發操作的。如果我們對每次寫入都創建一個數據庫連接,那么很容易的系統會出現瓶頸,系統的精力將會很多的放在維護鏈接上而非直接查詢操作上。這顯然是不可取的。
如果我們能夠保證系統中自始至終只有唯一一個數據庫連接對象,顯然我們會節省很多內存開銷和cpu利用率。這就是單件模式的用途。當然單件模式不僅僅只用於這樣的情況。在《設計模式:可復用面向對象軟件的基礎》一書中對單件模式的適用性有如下描述:
1、當類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時。
2、當這個唯一實例應該是通過子類化可擴展的,並且客戶應該無需更改代碼就能使用一個擴展的實例時。
下面對單件模式的懶漢式與餓漢式進行簡單介紹:
1、餓漢式:在程序啟動或單件模式類被加載的時候,單件模式實例就已經被創建。
2、懶漢式:當程序第一次訪問單件模式實例時才進行創建。
如何選擇:如果單件模式實例在系統中經常會被用到,餓漢式是一個不錯的選擇。
反之如果單件模式在系統中會很少用到或者幾乎不會用到,那么懶漢式是一個不錯的選擇。
餓漢模式demo:
public Simple(){ private static Single s=new Single(); private Single(){ } public static Simple getSimple(){ return s; }
}
一般用於枚舉法:
enum Single { Single; private Single() { } public void print(){ System.out.println("hello world"); } } public class SingleDemo { public static void main(String[] args) { Single a = Single.Single; a.print(); }
懶漢模式 demo:
class Single{ private static Single s = null; public Single() { if (s == null) s = new Single();
return s;
}
}
懶漢模式在使用時,容易引起不同步問題,所以應該創建同步"鎖",demo如下
class Single1 { private static Single1 s = null; public Single1() { } //同步函數的demo public static synchronized Single1 getInstance() { if (s == null) s = new Single1(); return s; } //同步代碼快的demo加鎖,安全高效 public static Single1 getInStanceBlock(){ if(s==null) synchronized (Single1.class) { if(s==null) s = new Single1(); } return s; } }