Android設(shè)計(jì)模式之單例模式詳解
單例模式
一個(gè)類只有一個(gè)實(shí)例,并且可以全局訪問(wèn)使用
應(yīng)用場(chǎng)景
如賬戶管理類,數(shù)據(jù)庫(kù)操作類等(某個(gè)對(duì)象頻繁被訪問(wèn)使用)
常用方式
餓漢式
懶漢式
同步加鎖
DCL雙重加鎖驗(yàn)證
靜態(tài)內(nèi)部類
枚舉單例
餓漢式
加載類的同時(shí)立即進(jìn)行初始化操作,對(duì)資源消耗很大
public class SingleTest { public static final SingleTest singleTest1=new SingleTest(); public SingleTest() { } public static SingleTest getSingleTest1(){ return singleTest1; } }
懶漢式
優(yōu)點(diǎn):需要使用時(shí)候才進(jìn)行初始化加載
缺點(diǎn):線程不安全,在多線程中很容易出現(xiàn)不同步的情況
public class SingleTest1 { private static SingleTest1 instance=null; public SingleTest1() { } public static SingleTest1 getInstance(){ if(instance==null){ instance=new SingleTest1(); } return instance; } }
同步加鎖
優(yōu)點(diǎn):解決線程安全問(wèn)題
缺點(diǎn):每次實(shí)例需要判斷加鎖狀態(tài),效率低下
public class SingleTest2 { private static SingleTest2 instance=null; public SingleTest2() { } public static synchronized SingleTest2 getInstance(){ if(instance==null){ instance=new SingleTest2(); } return instance; } }
DCL雙重校驗(yàn)
優(yōu)點(diǎn):并發(fā)不高的情況下可以完美運(yùn)行(推薦使用,客戶端幾乎不存在高并發(fā)情況)
缺點(diǎn):JDK1.5以前可能會(huì)出現(xiàn)instance為初始化的問(wèn)題(現(xiàn)在的Android幾乎都是1.7 1.8了幾乎可以略率此問(wèn)題)
public class SingleTest4 { private static SingleTest4 instance=null;//靜態(tài)變量 public SingleTest4() { } public static SingleTest4 getInstance(){ if (instance == null) {//第一層校驗(yàn) synchronized (SingleTest4.class) { if (instance == null) {//第二層校驗(yàn) instance = new SingleTest4(); } } } return instance; } }
靜態(tài)內(nèi)部類
優(yōu)點(diǎn):延遲加載,線程安全,內(nèi)存消耗少(推薦使用)
public class SingleTest5 { private SingleTest5() { } public static final SingleTest5 getInstance() { return SingletonHolder.INSTANCE; } //定義的靜態(tài)內(nèi)部類 private static class SingletonHolder { private static final SingleTest5 INSTANCE = new SingleTest5(); //創(chuàng)建實(shí)例的地方 } }
枚舉單例
優(yōu)點(diǎn):線程安全,防反序列化,防反射,寫(xiě)法簡(jiǎn)單
public enum SingleTest6 { //第一種方式 // INSTANCE; // private CaiPiao instance; // // SingleTest6() { // instance = new CaiPiao(); // } // // public CaiPiao getInstance() { // return instance; // } // // class CaiPiao { // // } //第二種方式 INSTANCE2{ @Override protected void CaiPiao() { System.out.println("彩票"); } }; protected abstract void CaiPiao(); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
總結(jié)Android App內(nèi)存優(yōu)化之圖片優(yōu)化
網(wǎng)上有很多大拿分享的關(guān)于Android性能優(yōu)化的文章,主要是通過(guò)各種工具分析,使用合理的技巧優(yōu)化APP的體驗(yàn),提升APP的流暢度,但關(guān)于內(nèi)存優(yōu)化的文章很少有看到。下面是我在實(shí)踐過(guò)程中使用的一些方法,很多都是不太成熟的項(xiàng)目,只是將其作為一種處理方式分享給大家。2016-08-08Android 如何實(shí)現(xiàn)exclude aar包中的某個(gè)jar包
這篇文章主要介紹了Android 如何實(shí)現(xiàn)exclude aar包中的某個(gè)jar包,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Android實(shí)現(xiàn)儀表盤(pán)控件開(kāi)發(fā)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)儀表盤(pán)控件開(kāi)發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05Android系統(tǒng)狀態(tài)欄定制圖標(biāo)顯示邏輯控制
這篇文章主要為大家介紹了Android系統(tǒng)狀態(tài)欄定制圖標(biāo)顯示邏輯控制,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Android圓形旋轉(zhuǎn)菜單開(kāi)發(fā)實(shí)例
本文給大家分享一個(gè)動(dòng)畫(huà)菜單,基于android開(kāi)發(fā)圓形旋轉(zhuǎn)菜單案例,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-09-09Activity取消界面切換的默認(rèn)動(dòng)畫(huà)方法(推薦)
下面小編就為大家?guī)?lái)一篇Activity取消界面切換的默認(rèn)動(dòng)畫(huà)方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12Android編程實(shí)現(xiàn)圖片拍照剪裁的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)圖片拍照剪裁的方法,涉及Android調(diào)用裁剪工具操作圖片的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12Android webview 遇到android.os.FileUriExposedException錯(cuò)誤解決辦法
這篇文章主要介紹了Android webview 遇到android.os.FileUriExposedException錯(cuò)誤解決辦法的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家遇到這樣的問(wèn)題解決,需要的朋友可以參考下2017-10-10