在好久以前,也就是在大二暑假的時候,那時候看馬士兵的視頻教程中有提到不少的設計模式。java
java的設計模式大體能夠分爲3大類,23種設計模式。web
其中,建立型模式有5種:單例模式、建造者模式、原型模式、工廠模式、抽象工廠模式。設計模式
結構型模式有7種:設配器模式、裝飾器模式、代理模式、外觀模式、享元模式、組合模式、橋接模式。緩存
行爲模式一種有11種:策略模式、模板方法模式、觀察者模式、迭代器模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。安全
這23種設計模式並非相互獨立的,它們之間也有相互的聯繫。app
本篇中要講的是單例模式。wordpress
單例模式顧名思義,就是指本系統中只容許存在一個實例。它是一個比較基本的模式,咱們平常設計中常常使用到的設計模式之一,比方說咱們常常使用的線程池,緩存,對話框,打印機,日誌對象,顯卡等設備驅動,這類對象只能有一個勢力,若是製做多個勢力,就可能會致使一些問題。經過單例模式,咱們能夠方便對實例的個數進行控制從而節省一些系統開銷。在單例模式中,咱們有餓漢模式和懶漢模式。字面理解,餓漢模式就是肚子餓了,一開始就把單例建立出來了,懶漢模式就是肚子不餓,等到肚子餓時(系統調用)纔去建立。 惡漢模式是線程安全的,懶漢模式由於在調用時建立,因此是非線程安排。
在建立單例模式時,咱們通常都須要把構造方法私有化,而後再咱們的類中聲明一個靜態方法,調用這個方法獲取實例。spa
餓漢模式線程
/** * 餓漢模式 * @author studyjun * */ public class HungryPattern { private static HungryPattern hPattern = new HungryPattern(); private HungryPattern(){ } public static HungryPattern getInstance(){ return hPattern; } }
懶漢模式設計
/** * 懶漢模式 * @author studyjun * */ public class LazyPattern { private static LazyPattern lPattern = null; private LazyPattern(){ } /** * 非線程安全 * @return */ public static LazyPattern getInstance(){ if (lPattern==null) { lPattern = new LazyPattern(); } return lPattern; } /** * 線程安全 ,效率比較差,能夠修改,請看getInstance3 * @return */ public static synchronized LazyPattern getInstance2(){ if (lPattern==null) { lPattern = new LazyPattern(); } return lPattern; } /** * 使用「雙重檢查枷鎖」,能夠減小getInstance()使用同步,只有在lPattern爲null時才進入線程同步 * 這樣就不用每次都進行線程同步,畢竟單例只需建立時同步就行。 * 線程安全 * @return */ public static synchronized LazyPattern getInstance3(){ if (lPattern==null) { synchronized(LazyPattern.class){ if (lPattern==null) { lPattern = new LazyPattern(); } } } return lPattern; } }
單例模式先說到這裏,等有機會在多舉一些例子完善
源碼下載:SingletonSimple