設計模式 單件 Singleton

2022-03-01 06:04:38 字數 1597 閱讀 3381

單件模式 singleton

什麼時候使用?當需要獨一無二的物件時,請想起他。

舉例:執行緒池(threadpool),快取(cache),對話方塊,處理偏好設定和登錄檔(registry)的物件,驅動程式物件。

無需具體例子,先看類圖:包含乙個private的自己的例項。private的建構函式,確保無法在類以外建立。在getinstance()中檢測私有例項是否建立,未則建立,若已存在則直接返回。

看**更好理解記憶。

經典實現方式 typical singleton

public

class

singleton

public

static

singleton getinstance

return

uniqueinstance;

}

}

經典實現看似完美,但存在問題。它不是執行緒安全的。當兩個執行緒同時呼叫的時候,有可能同時進入 uniqueinstance == null 的if塊中。這樣物件就不是唯一了。後進入的執行緒會獲得乙個新的instance。解決方法,馬上直觀想到,使用synchronized確保執行緒安全。 

singleton lazy initialized (延遲載入)

public

class

singleton

public

static

synchronized

singleton getinstance

return

uniqueinstance;

}

}

如果對效能要求非常高,以上synchronized確實每次都要判斷有效能擔憂。可以改進如下。

singleton eagerly initialized (急切建立)

public

class

singleton

public

static

synchronized

singleton getinstance

}

很好的解決問題了。以上利用了jvm載入機制。在載入類的時候就吧例項建立好。除此,還有一種方法。

singleton double-checked locking (雙重檢查鎖)

public

class

singleton

public

static

singleton getinstance

}}

return

uniqueinstance;

}

}

以上使用了volatile關鍵字,使uniqueinstance是執行緒同步讀的。即執行緒總能讀到最新的值。uniqueinstance為null時才進行建立。使用synchrinized確保執行緒安全。同時在塊內再次檢測是否需要建立。

Singleton單件設計模式

單例模式也稱為單件模式 單子模式 其應用場景是程式中需要寫個類,而這個類只能產生乙個例項。這個例項在全域性被所有類都能夠呼叫到,這個時候我們所使用的就是單例模式。該例項被所有程式模組共享。有很多地方需要這樣的功能模組,如系統的日誌輸出等。而乙個例項的實現方式有很多種,可以通過全域性變數來實現,但這樣...

設計模式 單件模式(Singleton)

singleton 在軟體系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在乙個例項,才能確保它們的邏輯正確性 以及良好的效率,比方說 執行緒池 threadpool 快取 cache 對話方塊 處理偏好設定和登錄檔的物件 日誌物件,充當印表機 顯示卡等裝置的驅動程式的物件。這些類物件只能有...

設計模式之 單件模式(Singleton)

單件模式的實現很簡單,基本上沒什麼好說,就說幾點 為什麼要單件模式?因為程式中很多物件只能有乙個,如日誌檔案,印表機等,如果出現多個就麻煩了。為什麼不用全域性變數?的確用全域性變數可以實現只有乙個物件,但是全域性變數必須在程式啟動的時候就初始化,萬一我們的物件很耗資源,但又不一定用到的話,全域性變數...