摘要:?jiǎn)渭J教峁┻@個(gè)實(shí)例的全局訪問點(diǎn)。實(shí)現(xiàn)單件模式,需要私有構(gòu)造器,一個(gè)靜態(tài)方法,一個(gè)靜態(tài)變量。設(shè)計(jì)到多線程問題,同步會(huì)降低程序效率。
擁有獨(dú)立且唯一的對(duì)象
這次講述的是單件模式,就是整個(gè)內(nèi)容里只有一個(gè)實(shí)例化“唯一”對(duì)象。這么說(shuō)可能有點(diǎn)拗口,這么說(shuō)吧,比方說(shuō),線程池,緩存,注冊(cè)表,日志文件,甚至做JDBC中連接,關(guān)閉,增刪改查數(shù)據(jù)庫(kù)的Connection類(個(gè)人命名也許并不一樣)、工具類等等。這些東西往往是要實(shí)例一次,就能在整個(gè)項(xiàng)目中使用了。
單件模式并不難理解定義如下
單件模式:確保一個(gè)類中只有一個(gè)實(shí)例,并提供一個(gè)全局訪問點(diǎn)。
是的就這么一句話的定義。一般單件模式分為“懶漢式”和“餓漢式”做法
直接上代碼。
“懶漢式”做法
package singleton01; public class Singleton01 { // 利用一個(gè)靜態(tài)變量記錄本類當(dāng)中唯一的實(shí)例(mySingleton01) private static Singleton01 mySingleton01 = null; public Singleton01() { } // synchronized關(guān)鍵字:線程同步鎖,在多線程中去互斥地訪問臨界資源 // 迫使每個(gè)線程在進(jìn)入方法之前,要先等別的線程執(zhí)行完離開方法后才能執(zhí)行,達(dá)到多個(gè)線程排隊(duì),不會(huì)造成有多個(gè)線程同時(shí)進(jìn)入這個(gè)方法 // 即是同步。但同步會(huì)使程序效率降低 public static synchronized Singleton01 getInstance() { if (mySingleton01 == null) { mySingleton01 = new Singleton01(); System.out.println("Singleton01被實(shí)例化了"); } System.out.println("返回Singleton01實(shí)例"); return mySingleton01; } /** * 上面方法就是常說(shuō)了“懶漢式”做法,大體意思就是當(dāng)誰(shuí)需要類方法時(shí)采取實(shí)例化 */ }
package singleton01; public class TestMain { public static void main(String[] args) { // 打印出前兩行結(jié)果 Singleton01 singleton01 = Singleton01.getInstance(); // 此時(shí)我們看到第二次調(diào)用類方法時(shí)候,沒有去實(shí)例對(duì)象 // 這里涉及并發(fā)方面問題,暫時(shí)沒學(xué)習(xí)并發(fā),具體怎么個(gè)原理我也不知道... Singleton01 singleton02 = Singleton01.getInstance(); } }
效果圖1
效果圖2
之前的做法中我們用到了synchronized,就是為了防止線程啟動(dòng)的隨機(jī)性找出變量混亂,我這個(gè)小例子可能看不出來(lái)什么。但實(shí)際上同步線程(synchronized)會(huì)使得程序效率大幅降低。利用雙重檢查加鎖可以有效解決此問題,
使用雙重檢查加鎖
package singleton01; public class singleton02 { // 利用雙重檢查加鎖,先檢查實(shí)例是否已經(jīng)創(chuàng)建,如果沒創(chuàng)建,就進(jìn)行同步。 // volatile:instance變量被初始化singleton02實(shí)例時(shí),多個(gè)線程會(huì)正確處理instance變量 // 線程是具有隨機(jī)性的,與程序執(zhí)行順序無(wú)關(guān)。 private volatile static singleton02 instance=null; public singleton02() { } public static singleton02 getInstance() { if (instance == null) { // 檢查實(shí)例,不存在的話進(jìn)入同步區(qū)域,只有第一次才執(zhí)行這里 synchronized (singleton02.class) { System.out.println("進(jìn)入同步區(qū)域"); if (instance == null) { System.out.println("instance被實(shí)例化了"); instance = new singleton02(); } } } System.out.println("返回instance實(shí)例"); return instance; } }
package singleton01; public class TestMain02 { public static void main(String[] args) { //第一次進(jìn)入方法會(huì)進(jìn)入同步區(qū)實(shí)例化 singleton02 singleton02 = null; singleton02 = singleton02.getInstance(); //當(dāng)?shù)诙芜M(jìn)入時(shí),已有實(shí)例,不會(huì)同步了,直接返回實(shí)例. singleton02 singleton03 = null; singleton03 = singleton02.getInstance(); } }
效果圖
"餓漢式"做法
package singleton02; public class Singleton { /** * “餓漢式”:加載這個(gè)類時(shí)立刻創(chuàng)建本類中唯一的單件實(shí)例, */ private static Singleton uniqueInstance = new Singleton(); private Singleton() { } public static Singleton getInstance() { System.out.println("返回實(shí)例實(shí)例"); return uniqueInstance; } }
package singleton02; public class TestMain { public static void main(String[] args) { //直接返回實(shí)例 Singleton singleton = Singleton.getInstance(); } }
效果圖
注:雙重檢查加鎖不適用與1.4之前的java版本。
要點(diǎn):
1、單件模式確保程序中一個(gè)類最多只有一個(gè)實(shí)例。
2、單件模式提供這個(gè)實(shí)例的全局訪問點(diǎn)。
3、實(shí)現(xiàn)單件模式,需要私有構(gòu)造器,一個(gè)靜態(tài)方法,一個(gè)靜態(tài)變量。
4、設(shè)計(jì)到多線程問題,同步會(huì)降低程序效率。
感謝你看到這里,至此單件模式內(nèi)容結(jié)束,本人文筆隨便,若有不足或錯(cuò)誤之處望給予指點(diǎn),90度彎腰~~~很快我會(huì)發(fā)布下一個(gè)設(shè)計(jì)模式內(nèi)容,生命不息,編程不止!
參考書籍:《Head First 設(shè)計(jì)模式》
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/70259.html
摘要:簡(jiǎn)介單件模式也叫單例模式,是一種創(chuàng)建型模式。類圖中類變量持有唯一的單件實(shí)例,是靜態(tài)方法,可以通過類名在任何需要的地方使用它,與訪問全局變量一樣,但是可以延遲實(shí)例化。 1. 簡(jiǎn)介 ??單件模式(Singleton)也叫單例模式,是一種創(chuàng)建型模式。它確保一個(gè)類只有一個(gè)實(shí)例,并提供全局訪問。 2. UML類圖 showImg(https://segmentfault.com/img/bVb...
摘要:急切的創(chuàng)建對(duì)象餓漢式以上爲(wèi)?zhàn)I漢式單列設(shè)計(jì),該設(shè)計(jì)是線程安全的,即不同的線程在調(diào)用時(shí)返回的是統(tǒng)一對(duì)象,在加載這個(gè)類時(shí),馬上創(chuàng)建了這個(gè)類的唯一單列實(shí)列。 單件模式(JAVA實(shí)現(xiàn)) 定義 單件模式: 確保一個(gè)類只有一個(gè)實(shí)列, 並提供一個(gè)全局訪問點(diǎn) 單件模式和全局變量的區(qū)別 若將對(duì)象賦值給一個(gè)全局變量, 則該對(duì)象需在程序開始時(shí)就創(chuàng)建好, 而改對(duì)象可能不會(huì)使用, 造成資源浪費(fèi), 而單件模式支持...
摘要:命令模式的由來(lái),其實(shí)是回調(diào)函數(shù)的一個(gè)面向?qū)ο蟮奶娲罚钅J皆缫讶谌氲搅苏Z(yǔ)言之中。 模式是對(duì)某情景下,針對(duì)某種問題的某種解決方案。而一個(gè)設(shè)計(jì)模式是用來(lái)解決一個(gè)經(jīng)常出現(xiàn)的設(shè)計(jì)問題的經(jīng)驗(yàn)方法。這么說(shuō)來(lái),每個(gè)模式都可能有著自己的意圖,應(yīng)用場(chǎng)景,使用方法和使用后果。本文的行文思路和目的皆在于了解各個(gè)模式的定義,應(yīng)用場(chǎng)景和用實(shí)例說(shuō)明如何在前端開發(fā)中使用。 本文所設(shè)計(jì)到的概念和實(shí)例大多來(lái)自《H...
閱讀 3043·2021-10-13 09:39
閱讀 1884·2021-09-02 15:15
閱讀 2450·2019-08-30 15:54
閱讀 1810·2019-08-30 14:01
閱讀 2608·2019-08-29 14:13
閱讀 1422·2019-08-29 13:10
閱讀 2736·2019-08-28 18:15
閱讀 3894·2019-08-26 10:20