要成為一個(gè)合格的程序猿,程序設(shè)計(jì)的思維那是必不可少的。今天來(lái)介紹一下java設(shè)計(jì)模式中最簡(jiǎn)單,也是最常用的設(shè)計(jì)模式,單例模式。
在java中,每個(gè)自定義類(lèi)都可以有無(wú)數(shù)個(gè)對(duì)象,而采用單例能極大的利用現(xiàn)有資源從而減少系統(tǒng)資源的浪費(fèi)。
單例模式的應(yīng)用場(chǎng)景非常廣泛,
如:數(shù)據(jù)庫(kù)連接池的設(shè)計(jì)就是采用單例,
servlet編程中每個(gè)servlet也是單例,
application也是單例的典型應(yīng)用,
在SPRing中每個(gè)bean默認(rèn)也是單例,
springmvc中 控制器對(duì)象也是單例等等。
單例模式有五種實(shí)現(xiàn)方式,最常用的有兩種,餓漢模式和懶漢模式,其它有雙重檢測(cè)鎖模式,靜態(tài)內(nèi)部類(lèi)模式以及枚舉類(lèi)模式實(shí)現(xiàn)
餓漢模式:線程安全,調(diào)用效率高,不能延遲加載
package com.panda.singleton;/** * 餓漢模式 * 線程安全,調(diào)用效率高,不能延遲加載 * @author Administrator */public class EhanSingleton { private EhanSingleton(){}; private static final EhanSingleton instance = new EhanSingleton(); public static EhanSingleton getInstance(){ return instance; }}懶漢模式:package com.panda.singleton;/** * 懶漢模式 * 線程安全,調(diào)用效率低,延遲加載 * 使用同步方法防止并發(fā)時(shí)產(chǎn)生多次示例 * @author Administrator */public class LhanSingleton { private LhanSingleton(){}; private static LhanSingleton instance; public static synchronized LhanSingleton getInstance(){ if(instance == null){ instance = new LhanSingleton(); } return instance; }} 雙重檢測(cè)鎖模式:package com.panda.singleton;/** * 雙重檢測(cè)鎖模式 * 線程安全,調(diào)用效率高,能延遲加載 * 由于JVM底層調(diào)用模型原因可能會(huì)出錯(cuò),不建議使用 * @author Administrator */public class SingletonDemo1 { private SingletonDemo1(){}; private static SingletonDemo1 instance; public static SingletonDemo1 getInstance(){ if(instance == null){ SingletonDemo1 sd; synchronized(SingletonDemo1.class){ sd = instance; if(sd == null){ synchronized(SingletonDemo1.class){ if(sd == null){ sd = new SingletonDemo1(); } } instance = sd; } } } return instance; }}靜態(tài)內(nèi)部類(lèi)模式:package com.panda.singleton;/** * 靜態(tài)內(nèi)部類(lèi)模式 * 線程安全,調(diào)用效率高,能延遲加載 * @author Administrator */public class SingletonDemo2 { private SingletonDemo2(){} private static class Singleton{ private static final SingletonDemo2 instance = new SingletonDemo2(); } public static SingletonDemo2 getInstance(){ return Singleton.instance; }}枚舉類(lèi)模式:package com.panda.singleton;/** * 餓漢模式 * 線程安全,調(diào)用效率高,不能延遲加載 * @author Administrator */public enum SingletonDemo3 { instance; //可以寫(xiě)自定義方法實(shí)現(xiàn)各自功能} 單例模式的實(shí)現(xiàn)方法就有這五種,如何選擇應(yīng)根據(jù)現(xiàn)實(shí)情況需要而定,比如當(dāng)類(lèi)的占用資源小且不需要延遲加載時(shí)應(yīng)該選用枚舉類(lèi)模式,而當(dāng)類(lèi)的占用資源大需要延遲加載時(shí)應(yīng)該選用靜態(tài)內(nèi)部類(lèi)模式實(shí)現(xiàn)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注