單例模式課件_第1頁
單例模式課件_第2頁
單例模式課件_第3頁
單例模式課件_第4頁
單例模式課件_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三講單例模式1-第三講單例模式1-場景—夢想SINGLETON—俺有6個漂亮的老婆,她們的老公都是我,我就是我們家里的老公Sigleton,她們只要說道"老公",都是指的同一個人,那就是我(剛才做了個夢啦,哪有這么好的事)

2-場景—夢想SINGLETON—俺有6個漂亮的老婆,她們的老公單例(singleton)模式單例模式:單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例單例模式。單例模式只應在有真正的“單一實例”的需求時才可使用。單例模式的要點(1)某個類只能有一個實例;(2)它必須自行創(chuàng)建這個實例;(3)它必須自行向整個系統(tǒng)提供這個實例。3-單例(singleton)模式單例模式:單例模式確保某一個類單例模式的關鍵特征意圖:希望類只有一個實例,但沒有控制類實例化的全局變量(對象)。同時希望確保所有客體對象使用該類的相同實例,而無需將引用傳給它們。問題:幾個不同的客戶對象需要引用同一個對象,而且希望確保這種類型的對象數(shù)目不超過一個。解決方案:保證一個實例參與者與協(xié)作者:客戶對象只能通過getInstance()方法創(chuàng)建單例類的實例。效果:客戶對象無需操心是否存在單例類的實例,實例化有單例類自己控制。實現(xiàn):一個引用單例對象的靜態(tài)私有成員變量一個公共靜態(tài)方法,負責實現(xiàn)一次性的實例化并返回對單例對象的引用設置為保護或私有的構造方法4-單例模式的關鍵特征意圖:希望類只有一個實例,但沒有控制類實例懶漢式VS餓漢式餓漢式:靜態(tài)初始化方式,在啟動加載單例類時就實例化對象,只實例化一次,以后用到的時候就不需要再去實例化了,加載類的時候速度比較慢,但以后獲得對象時的速度比較快,該對象從加載到應用結束一直占用資源。懶漢式:相當于一個延遲加載機制,即你需要這個對象時候才去實例化,加載類的時候速度比較快,但以后獲得對象時的速度比較慢,該對象在整個應用的生命周期只有一部分時間占用資源。面臨多線程訪問的安全性問題,需要做雙重鎖定處理才可以保證安全。所以,到底使用哪一種方式,要看實際的需求5-懶漢式VS餓漢式餓漢式:靜態(tài)初始化方式,在啟動加載單例單例(singleton)模式模式的結構中只包括一個角色:單件類(Singleton)

6-單例(singleton)模式模式的結構中只包括一個角色:6餓漢式7-餓漢式7-懶漢式8-懶漢式8-單例模式示例—餓漢式publicclassEagerSingleton{//類初始化時,已經(jīng)自行實例化privatestaticfinalEagerSingletonm_instance=newEagerSingleton();privateEagerSingleton(){}//私有化構造器publicstaticEagerSingletongetInstance(){returnm_instance;}}9-單例模式示例—餓漢式publicclassEagerSi單例模式示例—懶漢式publicclassSingleton{

privatestaticSingletoninstance=null;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){instance=newSingleton();}returninstance;}}10-單例模式示例—懶漢式publicclassSinglet單例模式的問題在多線程程序中,Singleton模式可能會出現(xiàn)一個問題。假設對getInstance()方法的兩個調用幾乎同時發(fā)生,這種情況可能非常糟糕。此時會發(fā)生什么?1.第一個線程檢查實例是否存在。因為實例不存在,該線程執(zhí)行創(chuàng)建第一個實例的代碼部分。2.然而,假設在實例化完成之前,另一個線程也來檢查實例成員變量是否為null。因為第一個線程還什么都沒有創(chuàng)建,實例成員變量仍然等于null,所以第二個線程也執(zhí)行了創(chuàng)建一個對象的代碼。3.現(xiàn)在,兩個線程都執(zhí)行了Singleton對象的new操作,因此創(chuàng)建了兩個重復的對象。11-單例模式的問題在多線程程序中,Singleton模式可能會出單例模式示例

—使用synchronizedpublicclassSingleton{privatestaticSingletoninstance=null;privateSingleton(){}publicstaticsynchronizedSingletongetInstance(){if(instance==null){instance=newSingleton();}returninstance;}}12-單例模式示例

—使用synchronizedpublicc單例模式示例

—雙檢鎖

DCL(Double-checkedlocking)publicclassSingleton{privatestaticSingletoninstance=null;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){//第一次檢查synchronized(Singleton.class){//第二次檢查if(instance==null){instance=newSingleton();}}}returninstance;}}13-單例模式示例

—雙檢鎖DCL(Double-checked單例模式示例--Classholder

publicclassSingletonFactory{

/*類級的內部類,也就是靜態(tài)的成員式內部類,該內部類的實例與外部類的實例沒有綁定關系,而且只有被調用到才會裝載,從而實現(xiàn)了延遲加載*/privatestaticclassSingletonHolder{publicstaticSingletoninstance=newSingleton();}//靜態(tài)初始化器,由JVM來保證線程安全

publicstaticSingletongetInstance(){returnSingletonHolder.instance;}}14-單例模式示例--Classholderpublicclholderclass模式什么是類級內部類?

簡單點說,類級內部類指的是:有static修飾的成員式內部類。如果沒有static修飾的成員式內部類被稱為對象級內部類。類級內部類相當于其外部類的static成分,它的對象與外部類對象間不存在依賴關系,因此可直接創(chuàng)建。而對象級內部類的實例,是綁定在外部對象實例中的。類級內部類中,可以定義靜態(tài)的方法,在靜態(tài)方法中只能夠引用外部類中的靜態(tài)成員方法或者成員變量。類級內部類相當于其外部類的成員,只有在第一次被使用的時候才會被裝載。15-holderclass模式什么是類級內部類?

簡單點說,holderclass模式在某些情況中,JVM已經(jīng)隱含地為您執(zhí)行了同步,這些情況下就不用自己再來進行同步控制了。這些情況包括:由靜態(tài)初始化器(在靜態(tài)字段上或static{}塊中的初始化器)初始化數(shù)據(jù)時

訪問final字段時要想很簡單的實現(xiàn)線程安全,可以采用靜態(tài)初始化器的方式,它可以由JVM來保證線程安全性。比如前面的“餓漢式”實現(xiàn)方式,但是這樣一來,不是會浪費一定的空間嗎?因為這種實現(xiàn)方式,會在類裝載的時候就初始化對象,不管你需不需要。16-holderclass模式在某些情況中,JVM已經(jīng)隱含地為holderclass模式的思路如果現(xiàn)在有一種方法能夠讓類裝載的時候不去初始化對象,那不就解決問題了?一種可行的方式就是采用類級內部類,在這個類級內部類里面去創(chuàng)建對象實例,這樣一來,只要不使用到這個類級內部類,那就不會創(chuàng)建對象實例。從而同時實現(xiàn)延遲加載和線程安全。17-holderclass模式的思路如果現(xiàn)在有一種方法能夠讓類holderclass模式的思路當getInstance方法第一次被調用的時候,它第一次讀取SingletonHolder.instance,導致SingletonHolder類得到初始化;而這個類在裝載并被初始化的時候,會初始化它的靜態(tài)域,從而創(chuàng)建Singleton的實例,由于是靜態(tài)的域,因此只會被虛擬機在裝載類的時候初始化一次,并由虛擬機來保證它的線程安全性。這個模式的優(yōu)勢在于,getInstance方法并沒有被同步,并且只是執(zhí)行一個域的訪問,因此延遲初始化并沒有增加任何訪問成本。18-holderclass模式的思路當getInstance方Enumsingleton/**

*使用枚舉來實現(xiàn)單例模式的示例

*/

publicenumSingletonC{

/**

*定義一個枚舉的元素,它就代表了Singleton的一個實例

*/

uniqueInstance;

/**

*示意方法,單例可以有自己的操作

*/

publicvoidsingletonOperation(){

//功能處理

}

}

19-Enumsingleton/**

*使用枚舉來實現(xiàn)單例模單例模式示例1.單件類(Singleton):Moon.javapublicclassMoon{privatestaticMoonuniqueMoon;doubleradius;doubledistanceToEarth;privateMoon(){uniqueMoon=this;radius=1738;distanceToEarth=363300;}publicstaticsynchronizedMoongetMoon(){if(uniqueMoon==null){uniqueMoon=newMoon();}returnuniqueMoon;}publicStringshow(){Strings="月亮的半徑是"+radius+"km,距地球是"+distanceToEarth+"km";returns;}}20-單例模式示例1.單件類(Singleton):Moon.j單例模式示例應用Application.javaimportjavax.swing.*;importjava.awt.*;publicclassApplication{publicstaticvoidmain(Stringargs[]){MyFramef1=newMyFrame("張三看月亮");MyFramef2=newMyFrame("李四看月亮");f1.setBounds(10,10,360,150);f2.setBounds(370,10,360,150);f1.validate();f2.validate();}}classMyFrameextendsJFrame{Stringstr;MyFrame(Stringtitle){setTitle(title);Moonmoon=Moon.getMoon();str=moon.show();setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);setVisible(true);repaint();}publicvoidpaint(Graphicsg){super.paint(g);g.setFont(newFont("宋體",Font.BOLD,14));g.drawString(str,5,100);}}21-單例模式示例應用Application.java21-單例模式的練習一個隨機數(shù)產生的例子在整個應用程序中只需要一個類的實例來產生隨機數(shù),客戶端程序從類中獲取這個實例,調用這個實例的方法nextInt(),公用的方法訪問需要進行同步,這是單例模式需要解決的同步問題。參與者:Singleton定義一個Instance操作,允許客戶訪問它的唯一實例,Instance是一個類操作,負責創(chuàng)建自己的唯一實例。協(xié)作關系:客戶只能通過Singleton的Instance操作訪問一個Singleton的實例。22-單例模式的練習一個隨機數(shù)產生的例子22-第三講單例模式23-第三講單例模式1-場景—夢想SINGLETON—俺有6個漂亮的老婆,她們的老公都是我,我就是我們家里的老公Sigleton,她們只要說道"老公",都是指的同一個人,那就是我(剛才做了個夢啦,哪有這么好的事)

24-場景—夢想SINGLETON—俺有6個漂亮的老婆,她們的老公單例(singleton)模式單例模式:單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例單例模式。單例模式只應在有真正的“單一實例”的需求時才可使用。單例模式的要點(1)某個類只能有一個實例;(2)它必須自行創(chuàng)建這個實例;(3)它必須自行向整個系統(tǒng)提供這個實例。25-單例(singleton)模式單例模式:單例模式確保某一個類單例模式的關鍵特征意圖:希望類只有一個實例,但沒有控制類實例化的全局變量(對象)。同時希望確保所有客體對象使用該類的相同實例,而無需將引用傳給它們。問題:幾個不同的客戶對象需要引用同一個對象,而且希望確保這種類型的對象數(shù)目不超過一個。解決方案:保證一個實例參與者與協(xié)作者:客戶對象只能通過getInstance()方法創(chuàng)建單例類的實例。效果:客戶對象無需操心是否存在單例類的實例,實例化有單例類自己控制。實現(xiàn):一個引用單例對象的靜態(tài)私有成員變量一個公共靜態(tài)方法,負責實現(xiàn)一次性的實例化并返回對單例對象的引用設置為保護或私有的構造方法26-單例模式的關鍵特征意圖:希望類只有一個實例,但沒有控制類實例懶漢式VS餓漢式餓漢式:靜態(tài)初始化方式,在啟動加載單例類時就實例化對象,只實例化一次,以后用到的時候就不需要再去實例化了,加載類的時候速度比較慢,但以后獲得對象時的速度比較快,該對象從加載到應用結束一直占用資源。懶漢式:相當于一個延遲加載機制,即你需要這個對象時候才去實例化,加載類的時候速度比較快,但以后獲得對象時的速度比較慢,該對象在整個應用的生命周期只有一部分時間占用資源。面臨多線程訪問的安全性問題,需要做雙重鎖定處理才可以保證安全。所以,到底使用哪一種方式,要看實際的需求27-懶漢式VS餓漢式餓漢式:靜態(tài)初始化方式,在啟動加載單例單例(singleton)模式模式的結構中只包括一個角色:單件類(Singleton)

28-單例(singleton)模式模式的結構中只包括一個角色:6餓漢式29-餓漢式7-懶漢式30-懶漢式8-單例模式示例—餓漢式publicclassEagerSingleton{//類初始化時,已經(jīng)自行實例化privatestaticfinalEagerSingletonm_instance=newEagerSingleton();privateEagerSingleton(){}//私有化構造器publicstaticEagerSingletongetInstance(){returnm_instance;}}31-單例模式示例—餓漢式publicclassEagerSi單例模式示例—懶漢式publicclassSingleton{

privatestaticSingletoninstance=null;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){instance=newSingleton();}returninstance;}}32-單例模式示例—懶漢式publicclassSinglet單例模式的問題在多線程程序中,Singleton模式可能會出現(xiàn)一個問題。假設對getInstance()方法的兩個調用幾乎同時發(fā)生,這種情況可能非常糟糕。此時會發(fā)生什么?1.第一個線程檢查實例是否存在。因為實例不存在,該線程執(zhí)行創(chuàng)建第一個實例的代碼部分。2.然而,假設在實例化完成之前,另一個線程也來檢查實例成員變量是否為null。因為第一個線程還什么都沒有創(chuàng)建,實例成員變量仍然等于null,所以第二個線程也執(zhí)行了創(chuàng)建一個對象的代碼。3.現(xiàn)在,兩個線程都執(zhí)行了Singleton對象的new操作,因此創(chuàng)建了兩個重復的對象。33-單例模式的問題在多線程程序中,Singleton模式可能會出單例模式示例

—使用synchronizedpublicclassSingleton{privatestaticSingletoninstance=null;privateSingleton(){}publicstaticsynchronizedSingletongetInstance(){if(instance==null){instance=newSingleton();}returninstance;}}34-單例模式示例

—使用synchronizedpublicc單例模式示例

—雙檢鎖

DCL(Double-checkedlocking)publicclassSingleton{privatestaticSingletoninstance=null;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){//第一次檢查synchronized(Singleton.class){//第二次檢查if(instance==null){instance=newSingleton();}}}returninstance;}}35-單例模式示例

—雙檢鎖DCL(Double-checked單例模式示例--Classholder

publicclassSingletonFactory{

/*類級的內部類,也就是靜態(tài)的成員式內部類,該內部類的實例與外部類的實例沒有綁定關系,而且只有被調用到才會裝載,從而實現(xiàn)了延遲加載*/privatestaticclassSingletonHolder{publicstaticSingletoninstance=newSingleton();}//靜態(tài)初始化器,由JVM來保證線程安全

publicstaticSingletongetInstance(){returnSingletonHolder.instance;}}36-單例模式示例--Classholderpublicclholderclass模式什么是類級內部類?

簡單點說,類級內部類指的是:有static修飾的成員式內部類。如果沒有static修飾的成員式內部類被稱為對象級內部類。類級內部類相當于其外部類的static成分,它的對象與外部類對象間不存在依賴關系,因此可直接創(chuàng)建。而對象級內部類的實例,是綁定在外部對象實例中的。類級內部類中,可以定義靜態(tài)的方法,在靜態(tài)方法中只能夠引用外部類中的靜態(tài)成員方法或者成員變量。類級內部類相當于其外部類的成員,只有在第一次被使用的時候才會被裝載。37-holderclass模式什么是類級內部類?

簡單點說,holderclass模式在某些情況中,JVM已經(jīng)隱含地為您執(zhí)行了同步,這些情況下就不用自己再來進行同步控制了。這些情況包括:由靜態(tài)初始化器(在靜態(tài)字段上或static{}塊中的初始化器)初始化數(shù)據(jù)時

訪問final字段時要想很簡單的實現(xiàn)線程安全,可以采用靜態(tài)初始化器的方式,它可以由JVM來保證線程安全性。比如前面的“餓漢式”實現(xiàn)方式,但是這樣一來,不是會浪費一定的空間嗎?因為這種實現(xiàn)方式,會在類裝載的時候就初始化對象,不管你需不需要。38-holderclass模式在某些情況中,JVM已經(jīng)隱含地為holderclass模式的思路如果現(xiàn)在有一種方法能夠讓類裝載的時候不去初始化對象,那不就解決問題了?一種可行的方式就是采用類級內部類,在這個類級內部類里面去創(chuàng)建對象實例,這樣一來,只要不使用到這個類級內部類,那就不會創(chuàng)建對象實例。從而同時實現(xiàn)延遲加載和線程安全。39-holderclass模式的思路如果現(xiàn)在有一種方法能夠讓類holderclass模式的思路當getInstance方法第一次被調用的時候,它第一次讀取SingletonHolder.instance,導致SingletonHolder類得到初始化;而這個類在裝載并被初始化的時候,會初始化它的靜態(tài)域,從而創(chuàng)建Singleton的實例,由于是靜態(tài)的域,因此只會被虛擬機在裝載類的時候初始化一次,并由虛擬機來保證它的線程安全性。這個模式的優(yōu)勢在于,getInstance方法并沒有被同步,并且只是執(zhí)行一個域的訪問,因此延遲初始化并沒有增加任何訪問成本。40-holderclass模式的思路當getInstance方Enumsingleton/**

*使用枚舉來實現(xiàn)單例模式的示例

*/

publicenumSingletonC{

/**

*定義一個枚舉的元素,它就代表了Singleton的一個實例

*/

uniqueInstance;

/**

*示意方法,單例可以有自己的操作

*/

publicvoidsingletonOperation(){

//功能處理

}

}

41-Enumsingleton/**

*使用枚舉來實現(xiàn)單例模單例模式示例1.單件類(Singleton):Moon.javapublicclassMoon{privatestaticMoonuniqueMoon;doubleradius;doubledistanceToEarth;privateMoon(){uniqueMoon=this;radius=1738;distanceToEarth=363300;}publicstaticsynchronizedMoongetMoon(){if(uniqueMoon==null){uniqueMoon=newMoon();}returnuniqueMoon;}publicStringshow(){Strings="月亮的半徑是"+radius

溫馨提示

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

評論

0/150

提交評論