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

下載本文檔

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

文檔簡介

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

2、系統(tǒng)應當集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調(diào)用??傊?,選擇單例模式就是為了避免不一致狀態(tài),避免政出多頭。首先看一個經(jīng)典的單例實現(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避免了類在外部被實例化,在同一個虛擬機范圍內(nèi),Singleton的唯一實例只能通過getInstance()方法訪問。(事實上,通過Java反射機制是能夠?qū)嵗瘶?gòu)造方法為private的類的,那基本上會使所有的Java單例實現(xiàn)失效。此問題在此處不做討論,姑且掩耳盜鈴地認為反射機制不存在。)但是以上實現(xiàn)沒有考慮線程安全問題。所謂線程安全是指:如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結(jié)果和單線程運行的結(jié)果是

4、一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。或者說:一個類或者程序所提供的接口對于線程來說是原子操作或者多個線程之間的切換不會導致該接口的執(zhí)行結(jié)果存在二義性,也就是說我們不用考慮同步的問題。顯然以上實現(xiàn)并不滿足線程安全的要求,在并發(fā)環(huán)境下很可能出現(xiàn)多個Singleton實例。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、類只能有一個實例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 /這個類必須自動向整個系統(tǒng)提供這個實例對象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)建的是同一個實例);13 else if(s!=s1)14 System.out.println(創(chuàng)建的不是同一個實例);15 else16 System.out.println(application error);17 18 19 運行結(jié)果:張孝祥張孝祥output message 張孝祥output message 張孝祥創(chuàng)建的是同一個實例結(jié)論:由結(jié)果可以得知單例模式為一個面向?qū)ο蟮膽贸绦蛱峁┝藢ο笪┮坏脑L問點,不管它實現(xiàn)何種功能,整個應用程序都會同享一個實例對象。

8、1.餓漢式單例類 1 /餓漢式單例類.在類初始化時,已經(jīng)自行實例化 2 public class Singleton1 3 /私有的默認構(gòu)造子 4 private Singleton1() 5 /已經(jīng)自行實例化 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)用的時候?qū)嵗?2 public class Singleton2 3

9、/私有的默認構(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里面的方法,將類名注冊,下次從里面直接獲取。 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 /保護的默認構(gòu)造子12 protected Singleton3()13 /靜態(tài)工廠方法,返還此類惟一的實例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 /一個示意性的商業(yè)方法33 public String abo

溫馨提示

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

評論

0/150

提交評論