當前位置:首頁 » 編程語言 » java中單例模式

java中單例模式

發布時間: 2025-06-29 18:32:31

java中單列模式,我要詳細點的,麻煩各位給我介紹一下

單例模式分三種:懶漢式單例、餓漢式單例、登記式單例三種。
單例模式有一下特點:
1、單例類只能有一個實例。
2、單例類必須自己自己創建自己的唯一實例。
3、單例類必須給所有其他對象提供這一實例。

一、懶漢式單例
在類被載入的時候,唯一實例已經被創建。這個設計模式在Java中容易實現,在別的語言中難以實現。
/**
* Created by IntelliJ IDEA.
* User: leimin
* Date: 2007-9-11
* Time: 14:57:08
* <<Java與模式>> 單例模式-懶漢式單例
*/
public class LazySingleton {
/**
* 私有靜態對象,載入時候不做初始化
*/
private static LazySingleton m_intance=null;
/**
* 私有構造方法,避免外部創建實例
*/
private LazySingleton(){
}
/**
* 靜態工廠方法,返回此類的唯一實例.
* 當發現實例沒有初始化的時候,才初始化.
* @return LazySingleton
*/
synchronized public static LazySingleton getInstance(){
if(m_intance==null){
m_intance=new LazySingleton();
}
return m_intance;
}
}
二、餓漢式單例
在類載入的時候不創建單例實例。只有在第一次請求實例的時候的時候創建,並且只在第一次創建後,以後不再創建該類的實例。
/**
* Created by IntelliJ IDEA.
* User: leimin
* Date: 2007-9-11
* Time: 14:45:25
* <<Java與模式>> 單例模式-餓漢式單例
*/
public class EagerSingleton {
/**
* 私有的(private)唯一(static final)實例成員,在類載入的時候就創建好了單例對象
*/
private static final EagerSingleton m_instance = new EagerSingleton();
/**
* 私有構造方法,避免外部創建實例
*/
private EagerSingleton() {
}
/**
* 靜態工廠方法,返回此類的唯一實例.
* @return EagerSingleton
*/
public static EagerSingleton getInstance() {
return m_instance;
}
}
三、登記式單例
這個單例實際上維護的是一組單例類的實例,將這些實例存放在一個Map(登記薄)中,對於已經登記過的實例,則從工廠直接返回,對於沒有登記的,則先登記,而後返回。
/**
* Created by IntelliJ IDEA.
* User: leimin
* Date: 2005-9-11
* Time: 15:20:16
* <<Java與模式>> 單例模式- 登記式單例
*/
public class RegSingleton {
/**
* 登記薄,用來存放所有登記的實例
*/
private static Map<String, RegSingleton> m_registry = new HashMap();
//在類載入的時候添加一個實例到登記薄
static {
RegSingleton x = new RegSingleton();
m_registry.put(x.getClass().getName(), x);
}
/**
* 受保護的默認構造方法
*/
protected RegSingleton() {
}
/**
* 靜態工廠方法,返回指定登記對象的唯一實例;
* 對於已登記的直接取出返回,對於還未登記的,先登記,然後取出返回
* @param name
* @return RegSingleton
*/
public static RegSingleton getInstance(String name) {
if (name == null) {
name = "RegSingleton";
}
if (m_registry.get(name) == null) {
try {
m_registry.put(name, (RegSingleton) Class.forName(name).newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return m_registry.get(name);
}
/**
* 一個示意性的商業方法
* @return String
*/
public String about() {
return "Hello,I am RegSingleton!";
}
}

單列的列子

第一種形式:
public class Singleton {
private Singleton(){}

private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}

第二種形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
if (instance==null)
instance=new Singleton();
return instance;
}
}

⑵ 在java開發中,為什麼要使用單例模式

java單例模式確保一個類只有一個實例,自行提供這個實例並向整個系統提供這個實例。

特點:

  1. 一個類只能有一個實例;

  2. 自己創建這個實例;

  3. 整個系統都要使用這個實例。

Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。在很多操作中,比如建立目錄 資料庫連接都需要這樣的單線程操作。一些資源管理器常常設計成單例模式。

外部資源:譬如每台計算機可以有若干個列印機,但只能有一個Printer Spooler,以避免兩個列印作業同時輸出到列印機中。每台計算機可以有若干個通信埠,系統應當集中管理這些通信埠,以避免一個通信埠被兩個請求同時調用。

內部資源,譬如,大多數的軟體都有一個(甚至多個)屬性文件存放系統配置。這樣的系統應當由一個對象來管理這些屬性文件。

單例模式,能避免實例重復創建;

單例模式,應用於避免存在多個實例引起程序邏輯錯誤的場合;

單例模式,較節約內存。

⑶ java 單例模式這個要怎麼理解

單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。
注意:
1、單例類只能有一個實例。
2、單例類必須自己創建自己的唯一實例。
3、單例類必須給所有其他對象提供這一實例。
介紹

意圖:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
主要解決:一個全局使用的類頻繁地創建與銷毀。
何時使用:當您想控制實例數目,節省系統資源的時候。
如何解決:判斷系統是否已經有這個單例,如果有則返回,如果沒有則創建。
關鍵代碼:構造函數是私有的。
應用實例:
1、一個班級只有一個班主任。
2、Windows 是多進程多線程的,在操作一個文件的時候,就不可避免地出現多個進程或線程同時操作一個文件的現象,所以所有文件的處理必須通過唯一的實例來進行。
3、一些設備管理器常常設計為單例模式,比如一個電腦有兩台列印機,在輸出的時候就要處理不能兩台列印機列印同一個文件。
優點:
1、在內存里只有一個實例,減少了內存的開銷,尤其是頻繁的創建和銷毀實例(比如管理學院首頁頁面緩存)。
2、避免對資源的多重佔用(比如寫文件操作)。
缺點:沒有介面,不能繼承,與單一職責原則沖突,一個類應該只關心內部邏輯,而不關心外面怎麼樣來實例化。
使用場景:
1、要求生產唯一序列號。
2、WEB 中的計數器,不用每次刷新都在資料庫里加一次,用單例先緩存起來。
3、創建的一個對象需要消耗的資源過多,比如 I/O 與資料庫的連接等。
注意事項:getInstance() 方法中需要使用同步鎖 synchronized (Singleton.class) 防止多線程同時進入造成 instance 被多次實例化。

熱點內容
857演算法 發布:2025-06-30 01:34:41 瀏覽:651
電腦版網易我的世界怎麼弄伺服器 發布:2025-06-30 01:34:40 瀏覽:769
mysql存儲過程ifbegin 發布:2025-06-30 01:32:53 瀏覽:748
安卓版x27怎麼備份 發布:2025-06-30 01:19:25 瀏覽:780
華為雲存儲怎麼清理 發布:2025-06-30 01:14:22 瀏覽:780
汽車壓縮機發熱 發布:2025-06-30 01:13:45 瀏覽:650
w我的世界拔刀劍伺服器ip 發布:2025-06-30 01:13:32 瀏覽:617
腳本雲手機 發布:2025-06-30 01:05:39 瀏覽:922
天玥伺服器是什麼品牌 發布:2025-06-30 01:04:31 瀏覽:286
標簽分類演算法 發布:2025-06-30 00:45:32 瀏覽:737