單例模式又叫做單態模式或者單件模式。在gof書中的定義:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
單例模式的目的就是要控制特停的類只產生乙個物件,當然也允許在一定情況下靈活的改變物件的個數。乙個類的物件的產生是由建構函式來完成的,如果想限制物件的產生,乙個辦法就是將建構函式變為私有的(至少是受保護的),使得外部的類不能通過引用來產生物件,同時為了保證類的可用性,就必須提供乙個自己的物件以及訪問這個物件的靜態方法。
單例模式可分為有狀態和無狀態的。有狀態的單例物件一般也是可變的單例物件,多個單態物件在一起就可以作為乙個狀態倉庫一樣向外提供服務。沒有狀態的單例物件也就是不變單例物件,僅用作提供工具函式。在計算機系統中,執行緒池、快取、日誌物件、對話方塊、印表機、顯示卡的驅動程式物件常被設計成單例。這些應用都或多或少具有資源管理器的功能。每台計算機可以有若干個印表機,但只能有乙個printer spooler,以避免兩個列印作業同時輸出到印表機中。每台計算機可以有若干通訊埠,系統應當集中管理這些通訊埠,以避免乙個通訊埠同時被兩個請求同時呼叫。總之,選擇單例模式就是為了避免不一致狀態,避免政出多頭。
//餓漢試
public
class singleton
//靜態工廠方法,提供了乙個供外部訪問得到物件的靜態方法
public
static singleton getinstance()
}
餓漢式在類建立的同時就已經建立好乙個靜態的物件供系統使用,以後不再改變,天生就是執行緒安全的。
//懶漢式
public
class singleton
//在靜態工廠方法內部例項化物件
public
static singleton getinstance()
return instance;}}
singleton通過將構造方法限定為private避免了類在外部被例項化,在同乙個虛擬機器範圍內,singleton的唯一例項只能通過getinstance()方法訪問。
但是以上懶漢式單例的實現沒有考慮執行緒安全問題,它是執行緒不安全的,併發環境下很可能出現多個singleton例項,要實現執行緒安全,有以下三種方式,都是對getinstance這個方法改造。
/在靜態工廠方法內部例項化物件,並且使用synchronized關鍵字
//雙重檢查鎖定不是執行緒安全的,需要使用volatile關鍵字
private
static
volatile singleton singleton = null;
public
static singleton getinstance()}}
return singleton;
}
在併發環境下的單例實現方式,我們通常可以採用雙重檢查加鎖(double-check-lock)的方式來實現。
public
class singleton
//空參構造
private
singleton()
public
static final singleton getinatance()
}
使用內部類,即實現了執行緒安全,又避免了同步帶來的效能問題。
三種懶漢模式的區別第一種,在方法呼叫上加了同步,雖然執行緒安全了,但是每次都要同步,會影響效能,畢竟99%的情況下是不需要同步的。
第二種,在getinstance中做了兩次null檢查,確保了只有第一次呼叫單例的時候才會做同步,但是不是執行緒安全的,如果要用這種方式,需要使用volatile關鍵字。可以避免了每次都同步的效能損耗。
第三種,利用了classloader的機制來保證初始化instance時只有乙個執行緒,所以也是執行緒安全的,同時沒有效能損耗,所以一般我傾向於使用這一種。
單例設計模式(餓漢單例設計模式 懶漢單例設計模式)
1.什麼是單例 單例的意思是乙個類永遠只存在乙個物件,不能建立多個物件。2.為什麼要用單例 開發中有很多的物件我們只需要乙個,例如虛擬機器物件,任務管理器物件 物件越多越佔記憶體,有時候只需要乙個物件就可以實現業務,單例可以節省記憶體空間。3.如何實現單例 單例的實現方式有 餓漢單例設計模式 通過類...
設計模式 單例設計模式
歷史 最早是建築學領域的模式,然後gof四人由其引申到編碼方面,總結了23種設計模式 設計模式 解決某一類事情最行之有效的方法 2.1 體現 餓漢式,保證物件的唯一性 class singleton 私有化建構函式禁止該類建立物件 private static singleton st new si...
設計模式 單例設計模式
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項 單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。單例設計模式 解決的問題 可以保...