日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java单例模式的实现方法_JAVA单例模式的几种实现方法

發布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java单例模式的实现方法_JAVA单例模式的几种实现方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

class EagerSingleton {

private static final EagerSingleton m_instance = new EagerSingleton();

/** * 私有的默認構造子 */

private EagerSingleton() {

}

/**

* * 靜態工廠方法

*/

public static EagerSingleton getInstance() {

return m_instance;

}

}

2 懶漢式單例類.在第一次調用的時候實例化

class LazySingleton {

// 注意,這里沒有final

private static LazySingleton m_instance = null;

/** * 私有的默認構造子 */

private LazySingleton() {

}

/**

* * 靜態工廠方法

*/

public synchronized static LazySingleton getInstance() {

if (m_instance == null) {

m_instance = new LazySingleton();

}

return m_instance;

}

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

建議使用所謂的"雙重檢查成例".必須指出的是,"雙重檢查成例"不可以在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() {

}

/** * 靜態工廠方法,返還此類惟一的實例 */

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() {

}

/** * 靜態工廠方法 */

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/

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的java单例模式的实现方法_JAVA单例模式的几种实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。