<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 71  文章 - 15  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    因為口渴,上帝創造了水;
    因為黑暗,上帝創造了火;
    因為我需要朋友,所以上帝讓你來到我身邊
    Click for Shaanxi xi'an, Shaanxi Forecast
    ╱◥█◣
      |田|田|
    ╬╬╬╬╬╬╬╬╬╬╬
    If only I have such a house!
    〖總在爬山 所以艱辛〗
    Email:myesjoy@yahoo.com.cn
    NickName:yesjoy
    MSN:myesjoy@hotmail.com
    QQ:150230516

    〖總在尋夢 所以苦痛〗

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    Hibernate在線

    Java友情

    Java認證

    linux經典

    OA系統

    Spring在線

    Structs在線

    專家專欄

    企業信息化

    大型設備共享系統

    工作流

    工作流產品

    網上購書

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    概要
    單例模式是最簡單的設計模式之一,但是對于Java的開發者來說,它卻有很多缺陷。在本月的專欄中,David Geary探討了單例模式以及在面對多線程(multithreading)、類裝載器(classloaders)和序列化(serialization)時如何處理這些缺陷。

    單例模式適合于一個類只有一個實例的情況,比如窗口管理器,打印緩沖池和文件系統,它們都是原型的例子。典型的情況是,那些對象的類型被遍及一個軟件系統的不同對象訪問,因此需要一個全局的訪問指針,這便是眾所周知的單例模式的應用。當然這只有在你確信你不再需要任何多于一個的實例的情況下。
    單例模式的用意在于前一段中所關心的。通過單例模式你可以:

  • 確保一個類只有一個實例被建立
  • 提供了一個對對象的全局訪問指針
  • 在不影響單例類的客戶端的情況下允許將來有多個實例

    盡管單例設計模式如在下面的圖中的所顯示的一樣是最簡單的設計模式,但對于粗心的Java開發者來說卻呈現出許多缺陷。這篇文章討論了單例模式并揭示了那些缺陷。
    注意:你可以從Resources下載這篇文章的源代碼。

    單例模式


    在《設計模式》一書中,作者這樣來敘述單例模式的:確保一個類只有一個實例并提供一個對它的全局訪問指針。
    下圖說明了單例模式的類圖。
    (圖1)

    單例模式的類圖

    正如你在上圖中所看到的,這不是單例模式的完整部分。此圖中單例類保持了一個對唯一的單例實例的靜態引用,并且會從靜態getInstance()方法中返回對那個實例的引用。
    例1顯示了一個經典的單例模式的實現。
    例1.經典的單例模式
    1. public class ClassicSingleton {
    2.    private static ClassicSingleton instance = null;
    3.    protected ClassicSingleton() {
    4.       // Exists only to defeat instantiation.
    5.    }
    6.    public static ClassicSingleton getInstance() {
    7.       if(instance == null) {
    8.          instance = new ClassicSingleton();
    9.       }
    10.       return instance;
    11.    }
    12. }

    在例1中的單例模式的實現很容易理解。ClassicSingleton類保持了一個對單獨的單例實例的靜態引用,并且從靜態方法getInstance()中返回那個引用。
    關于ClassicSingleton類,有幾個讓我們感興趣的地方。首先,ClassicSingleton使用了一個眾所周知的懶漢式實例化去創建那個單例類的引用;結果,這個單例類的實例直到getInstance()方法被第一次調用時才被創建。這種技巧可以確保單例類的實例只有在需要時才被建立出來。其次,注意ClassicSingleton實現了一個protected的構造方法,這樣客戶端不能直接實例化一個ClassicSingleton類的實例。然而,你會驚奇的發現下面的代碼完全合法:
    1. public class SingletonInstantiator { 
    2.   public SingletonInstantiator() { 
    3.    ClassicSingleton instance = ClassicSingleton.getInstance();
    4. ClassicSingleton anotherInstance =
    5. new ClassicSingleton();
    6.        ... 
    7.   } 
    8. }

    前面這個代碼片段為何能在沒有繼承ClassicSingleton并且ClassicSingleton類的構造方法是protected的情況下創建其實例?答案是protected的構造方法可以被其子類以及在同一個包中的其它類調用。因為ClassicSingleton和SingletonInstantiator位于相同的包(缺省的包),所以SingletonInstantiator方法能創建ClasicSingleton的實例。
    這種情況下有兩種解決方案:一是你可以使ClassicSingleton的構造方法變化私有的(private)這樣只有ClassicSingleton的方法能調用它;然而這也意味著ClassicSingleton不能有子類。有時這是一種很合意的解決方法,如果確實如此,那聲明你的單例類為final是一個好主意,這樣意圖明確,并且讓編譯器去使用一些性能優化選項。另一種解決方法是把你的單例類放到一個外在的包中,以便在其它包中的類(包括缺省的包)無法實例化一個單例類。
    關于ClassicSingleton的第三點感興趣的地方是,如果單例由不同的類裝載器裝入,那便有可能存在多個單例類的實例。假定不是遠端存取,例如一些servlet容器對每個servlet使用完全不同的類裝載器,這樣的話如果有兩個servlet訪問一個單例類,它們就都會有各自的實例。
    第四點,如果ClasicSingleton實現了java.io.Serializable接口,那么這個類的實例就可能被序列化和復原。不管怎樣,如果你序列化一個單例類的對象,接下來復原多個那個對象,那你就會有多個單例類的實例。
    最后也許是最重要的一點,就是例1中的ClassicSingleton類不是線程安全的。如果兩個線程,我們稱它們為線程1和線程2,在同一時間調用ClassicSingleton.getInstance()方法,如果線程1先進入if塊,然后線程2進行控制,那么就會有ClassicSingleton的兩個的實例被創建。

    正如你從前面的討論中所看到的,盡管單例模式是最簡單的設計模式之一,在Java中實現它也是決非想象的那么簡單。這篇文章接下來會揭示Java規范對單例模式進行的考慮,但是首先讓我們近水樓臺的看看你如何才能測試你的單例類。

    未完待續。
  • posted on 2006-02-14 15:32 ★yesjoy★ 閱讀(222) 評論(0)  編輯  收藏 所屬分類: 設計模式
    主站蜘蛛池模板: 99精品视频在线免费观看| 春暖花开亚洲性无区一区二区 | 国产真人无码作爱免费视频| 国产真实伦在线视频免费观看| 亚洲av午夜国产精品无码中文字| 免费鲁丝片一级在线观看| 亚洲精品久久无码| 青草草在线视频永久免费| 国产成人人综合亚洲欧美丁香花 | 日韩一区二区免费视频| 亚洲国产精品嫩草影院| 四虎影院永久免费观看| CAOPORM国产精品视频免费| 亚洲综合AV在线在线播放| APP在线免费观看视频| 老司机亚洲精品影院无码| www视频免费看| 亚洲欧美不卡高清在线| 免费h成人黄漫画嘿咻破解版| 四虎精品成人免费视频| 亚洲欧洲无码AV电影在线观看| 无码av免费网站| 亚洲a级片在线观看| 四虎成人精品在永久免费| a级毛片免费完整视频| 亚洲综合久久1区2区3区| 国语成本人片免费av无码| 免费国产在线精品一区| 亚洲VA中文字幕无码一二三区 | 亚洲欧洲日产国码无码久久99| 午夜免费福利视频| 伊人久久亚洲综合影院首页| 全亚洲最新黄色特级网站| a级日本高清免费看| 中文字幕无码亚洲欧洲日韩| 亚洲成a人片在线播放| 精品国产sm捆绑最大网免费站 | 亚洲日产乱码一二三区别| 亚洲精品第一国产综合精品99| 国产99视频精品免费专区| 亚洲av午夜电影在线观看|