JAVA單例模式的幾種實現方法

來源:互聯網
上載者:User

1 餓漢式單例類.在類初始化時,已經自行執行個體化 

class EagerSingleton {      private static final EagerSingleton m_instance = new EagerSingleton();         /** * 私人的預設構造子 */     private EagerSingleton() {       }         /**     * * 靜態Factory 方法     */     public static EagerSingleton getInstance() {        return m_instance;       }    }  

2 懶漢式單例類.在第一次調用的時候執行個體化

class LazySingleton {      // 注意,這裡沒有final      private static LazySingleton m_instance = null;         /** * 私人的預設構造子 */     private LazySingleton() {       }         /**     * * 靜態Factory 方法     */     public synchronized static LazySingleton getInstance() {        if (m_instance == null) {           m_instance = new LazySingleton();         }        return m_instance;       }    }   

          在上面給出懶漢式單例類實現裡對靜態Factory 方法使用了同步化,以處理多線程環境。有些設計師在這裡

建議使用所謂的"雙重檢查成例".必須指出的是,"雙重檢查成例"不可以在Java 語言中使用。不十分熟

悉的讀者,可以看看後面給出的小節。

  同樣,由於構造子是私人的,因此,此類不能被繼承。餓漢式單例類在自己被載入時就將自己執行個體

化。即便載入器是靜態,在餓漢式單例類被載入時仍會將自己執行個體化。單從資源利用效率角度來講,

這個比懶漢式單例類稍差些。

  從速度和反應時間角度來講,則比懶漢式單例類稍好些。然而,懶漢式單例類在執行個體化時,必須處

理好在多個線程同時首次引用此類時的訪問限制問題,特別是當單例類作為資源控制器,在執行個體化時必

然涉及資源初始化,而資源初始化很有可能耗費時間。這意味著出現多線程同時首次引用此類的機率變

得較大。

  餓漢式單例類可以在Java 語言內實現, 但不易在C++ 內實現,因為靜態初始化在C++ 裡沒有固定

的順序,因而靜態m_instance 變數的初始化與類的載入順序沒有保證,可能會出問題。這就是為什麼

GoF 在提出單例類的概念時,舉的例子是懶漢式的。他們的書影響之大,以致Java 語言中單例類的例子

也大多是懶漢式的。實際上,本書認為餓漢式單例類更符合Java 語言本身的特點。

 3 登記式單例類.類似Spring裡面的方法,將類名註冊,下次從裡面直接擷取。 查看複製到剪下板列印

import java.util.HashMap;       class RegSingleton {      static private HashMap m_registry = new HashMap();      static {         RegSingleton x = new RegSingleton();         m_registry.put(x.getClass().getName(), x);       }         /** * 保護的預設構造子 */     protected RegSingleton() {       }         /** * 靜態Factory 方法,返還此類惟一的執行個體 */     static public RegSingleton getInstance(String name) {        if (name == null) {           name = RegSingleton.class.getName();         }        if (m_registry.get(name) == null) {          try {             m_registry.put(name, Class.forName(name).newInstance());           } catch (Exception e) {             System.out.println("Error happened.");           }          return (RegSingleton) (m_registry.get(name));         }        return null;       }         /** * 一個示意性的商業方法 */     public String about() {        return "Hello, I am RegSingleton.";       }    }       class RegSingletonChild extends RegSingleton {      public RegSingletonChild() {       }         /** * 靜態Factory 方法 */     static public RegSingletonChild getInstance() {        return (RegSingletonChild) RegSingleton.getInstance("com.javapatterns.singleton.demos.RegSingletonChild");       }         /** * 一個示意性的商業方法 */     public String about() {        return "Hello, I am RegSingletonChild.";       }    }  

轉自:http://langfangwangbin.blog.163.com/blog/static/1005436342008112711449788/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.