一:使用場景
1)經常使用的地方:一個類只有一個實例,eg:頁面訪問統計pv,統計的個數就只能保證一個實例的統計。
2)我們目前使用的情況:比如我想創建一個對象,這個對象希望只有一份實例的維護,在內存的保存也只有一份,也就是在同一個jvm的java堆里只保存一份實例對象,所以你會想一辦法,在創建這個對象的時候,就已經能保證只有一份。
3)怎么改進:定義該對象的時候,就保證是同一份實例,比如:定義為私有構造函數,防止通過new的方式可以創建對象,然后在對象里定義一個靜態的私有成員(本身對象的一個實例),然后再創建一個外面訪問該對象的方法就好了。
4)改進的好處:代碼在編譯代碼這個級別就被控制了,不至于在jvm里運行的時候才來保證,把唯一實例的創建保證在編譯階段;jvm里內存只有一份,從而內存占有率更低,以及更方便java垃圾回收
5)改進后的壞處:只能是代碼稍微需要更多點,其實大家最后發現改進后的壞處,都是代碼定義比之間要多一點,但以后的維護代碼就降下來了,也短暫的代碼量偏大來換取以后代碼的精簡。
二:一個實際的例子
總體的例子
package com.mike.pattern.singleton;
/**
* 總統
*
* @author taoyu
*
* @since 2010-6-22
*/
public class President {
private President(){
System.out.println("總統已經選舉出來了");
}
/**總統只有一個*/
private static President president=new President();
/**
* 返回總統
*/
public static President getPresident(){
return president;
}
/**
* 總統宣布選舉成功
*/
public void announce(){
System.out.println("偉大的中國人民,我將成你們新的總統");
}
}
/**
* @param args
*/
public static void main(String[] args) {
President president=President.getPresident();
president.announce();
}