做爲程序員必讀經典《重構 改善既有代碼的設計》《effective java》兩本書,對於提高本身代碼的優雅程度確實是很是有幫助。這段事件在學習設計模式,看了《大話設計模式》,雖然這是一本很受非議的一本書,可是每一件事情都是小馬過河,不親自試試怎麼知道不適合本身呢。java
看過大話設計模式以後,感受有那麼一絲明悟,對於面向對象的理解彷佛有那麼更近一層的理解,在寫優質的代碼方面,頗有幫助。程序員
進入正題,單例模式。設計模式
有些對象只須要一個,如:配置文件、工具類、線程池、緩存、日誌對象等
多個程序讀取一個配置文件,實際上配置文件仍是隻有一個,若是創造出多個實例,就會致使不少問題,佔用資源過多,不一致的結果等
單例對象(Singleton)是一種經常使用的設計模式。在Java應用中,單例對象能保證在一個JVM中,該對象只有一個實例存在。這樣的模式有幾個好處:
一、某些類建立比較頻繁,對於一些大型的對象,這是一筆很大的系統開銷。
二、省去了new操做符,下降了系統內存的使用頻率,減輕GC壓力。
三、有些類如交易所的核心交易引擎,控制着交易流程,若是該類能夠建立多個的話,系統徹底亂了。(好比一個軍隊出現了多個司令員同時指揮,確定會亂成一團),因此只有使用單例模式,才能保證核心交易服務器獨立控制整個流程。緩存
單例模式分類:安全
一、餓漢模式 加載類時建立實例,所以加載類比較慢,運行時獲取實例比較快,且是線程安全的
二、懶漢模式 不在類加載時建立,獲取時才建立實例,因此類加載時比較快而獲取實例是比較慢,且是線程不安全服務器
//餓漢式 class Fruit{ public static Fruit fruit = new Fruit(); private Fruit(){ } public static Fruit getInstance(){ return fruit; } }
public static void main(String[] args) { //餓漢式 Fruit f1 = Fruit.getInstance(); Fruit f2 = Fruit.getInstance(); System.out.println(f1); System.out.println(f2); }
public class Person { public static Person person; //定義私有的構造函數,防止外部進行建立對象 private Person(){ } public static Person getInstance(){ if(person == null){ synchronized(Person.class){ if(person == null){//雙重檢查 person = new Person(); } } } return person; } }
public static void main(String[] args) { //懶漢式 Person p1 = Person.getInstance(); Person p2 = Person.getInstance(); System.out.println(p1); System.out.println(p2); }