java單例模式詳解_第1頁
java單例模式詳解_第2頁
java單例模式詳解_第3頁
java單例模式詳解_第4頁
java單例模式詳解_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Java 單例模式詳解 概念:java中單例模式是一種常見的設(shè)計(jì)模式,單例模式分三種:懶漢式單例、餓漢式單例、登記式單例三種。單例模式有一下特點(diǎn):1、單例類只能有一個(gè)實(shí)例。2、單例類必須自己自己創(chuàng)建自己的唯一實(shí)例。3、單例類必須給所有其他對(duì)象提供這一實(shí)例。單例模式確保某個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。在計(jì)算機(jī)系統(tǒng)中,線程池、緩存、日志對(duì)象、對(duì)話框、打印機(jī)、顯卡的驅(qū)動(dòng)程序?qū)ο蟪1辉O(shè)計(jì)成單例。這些應(yīng)用都或多或少具有資源管理器的功能。每臺(tái)計(jì)算機(jī)可以有若干個(gè)打印機(jī),但只能有一個(gè)Printer Spooler,以避免兩個(gè)打印作業(yè)同時(shí)輸出到打印機(jī)中。每臺(tái)計(jì)算機(jī)可以有若干通信端口,

2、系統(tǒng)應(yīng)當(dāng)集中管理這些通信端口,以避免一個(gè)通信端口同時(shí)被兩個(gè)請(qǐng)求同時(shí)調(diào)用。總之,選擇單例模式就是為了避免不一致狀態(tài),避免政出多頭。首先看一個(gè)經(jīng)典的單例實(shí)現(xiàn)。public class Singleton private static Singleton uniqueInstance = null; private Singleton() / Exists only to defeat instantiation. public static Singleton getInstance() if (uniqueInstance = null) uniqueInstance = new Singlet

3、on(); return uniqueInstance; / Other methods.Singleton通過將構(gòu)造方法限定為private避免了類在外部被實(shí)例化,在同一個(gè)虛擬機(jī)范圍內(nèi),Singleton的唯一實(shí)例只能通過getInstance()方法訪問。(事實(shí)上,通過Java反射機(jī)制是能夠?qū)嵗瘶?gòu)造方法為private的類的,那基本上會(huì)使所有的Java單例實(shí)現(xiàn)失效。此問題在此處不做討論,姑且掩耳盜鈴地認(rèn)為反射機(jī)制不存在。)但是以上實(shí)現(xiàn)沒有考慮線程安全問題。所謂線程安全是指:如果你的代碼所在的進(jìn)程中有多個(gè)線程在同時(shí)運(yùn)行,而這些線程可能會(huì)同時(shí)運(yùn)行這段代碼。如果每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是

4、一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程安全的?;蛘哒f:一個(gè)類或者程序所提供的接口對(duì)于線程來說是原子操作或者多個(gè)線程之間的切換不會(huì)導(dǎo)致該接口的執(zhí)行結(jié)果存在二義性,也就是說我們不用考慮同步的問題。顯然以上實(shí)現(xiàn)并不滿足線程安全的要求,在并發(fā)環(huán)境下很可能出現(xiàn)多個(gè)Singleton實(shí)例。1 public class TestStream 2 private String name; 3 public String getName() 4 return name; 5 6 public void setName(String name) 7 = name; 8 9 /該

5、類只能有一個(gè)實(shí)例10 private TestStream() /私有無參構(gòu)造方法11 /該類必須自行創(chuàng)建12 /有2種方式13 /*private static final TestStream ts=new TestStream();*/14 private static TestStream ts1=null;15 /這個(gè)類必須自動(dòng)向整個(gè)系統(tǒng)提供這個(gè)實(shí)例對(duì)象16 public static TestStream getTest()17 if(ts1=null)18 ts1=new TestStream();19 20 return ts1;21 22 public void getInf

6、o()23 System.out.println(output message +name);24 25 1 public class TestMain 2 public static void main(String args) 3 TestStream s=TestStream.getTest(); 4 s.setName(張孝祥); 5 System.out.println(s.getName(); 6 TestStream s1=TestStream.getTest(); 7 s1.setName(張孝祥); 8 System.out.println(s1.getName(); 9 s

7、.getInfo();10 s1.getInfo();11 if(s=s1)12 System.out.println(創(chuàng)建的是同一個(gè)實(shí)例);13 else if(s!=s1)14 System.out.println(創(chuàng)建的不是同一個(gè)實(shí)例);15 else16 System.out.println(application error);17 18 19 運(yùn)行結(jié)果:張孝祥張孝祥output message 張孝祥output message 張孝祥創(chuàng)建的是同一個(gè)實(shí)例結(jié)論:由結(jié)果可以得知單例模式為一個(gè)面向?qū)ο蟮膽?yīng)用程序提供了對(duì)象惟一的訪問點(diǎn),不管它實(shí)現(xiàn)何種功能,整個(gè)應(yīng)用程序都會(huì)同享一個(gè)實(shí)例對(duì)象。

8、1.餓漢式單例類 1 /餓漢式單例類.在類初始化時(shí),已經(jīng)自行實(shí)例化 2 public class Singleton1 3 /私有的默認(rèn)構(gòu)造子 4 private Singleton1() 5 /已經(jīng)自行實(shí)例化 6 private static final Singleton1 single = new Singleton1(); 7 /靜態(tài)工廠方法 8 public static Singleton1 getInstance() 9 return single;10 11 2.懶漢式單例類 1 /懶漢式單例類.在第一次調(diào)用的時(shí)候?qū)嵗?2 public class Singleton2 3

9、/私有的默認(rèn)構(gòu)造子 4 private Singleton2() 5 /注意,這里沒有final 6 private static Singleton2 single=null; 7 /靜態(tài)工廠方法 8 public synchronized static Singleton2 getInstance() 9 if (single = null) 10 single = new Singleton2();11 12 return single;13 14 3.登記式單例類 1 import java.util.HashMap; 2 import java.util.Map; 3 /登記式單例類

10、. 4 /類似Spring里面的方法,將類名注冊(cè),下次從里面直接獲取。 5 public class Singleton3 6 private static Map map = new HashMap(); 7 static 8 Singleton3 single = new Singleton3(); 9 map.put(single.getClass().getName(), single);10 11 /保護(hù)的默認(rèn)構(gòu)造子12 protected Singleton3()13 /靜態(tài)工廠方法,返還此類惟一的實(shí)例14 public static Singleton3 getInstance(

11、String name) 15 if(name = null) 16 name = Singleton3.class.getName();17 System.out.println(name = null+-name=+name);18 19 if(map.get(name) = null) 20 try 21 map.put(name, (Singleton3) Class.forName(name).newInstance();22 catch (InstantiationException e) 23 e.printStackTrace();24 catch (IllegalAccessException e) 25 e.printStackTrace();26 catch (ClassNotFoundException e) 27 e.printStackTrace();28 29 30 return map.get(name);31 32 /一個(gè)示意性的商業(yè)方法33 public String abo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論