設計模式筆記 3 單例模式

2021-08-15 14:37:58 字數 1594 閱讀 7584

單例類只能有乙個例項

單例類必須自己建立自己的唯一例項

單例類必須提供給所有其他物件這個例項

單例類有私有的構造方法和本身的乙個靜態例項物件

單例類向外界提供乙個可訪問的靜態方法,供外界獲取它的靜態例項。

目的:保證乙個類有且僅返回這乙個例項物件。

public class singleobject 

private static singleobject getinstance()

public void showmsg()

}

解決:乙個全域性使用的類頻繁地建立和銷毀。

構造方法是私有的決定了外界無法呼叫構造方法建立例項,必須通過單例類提供的靜態方法獲取唯一的類靜態例項。

單例模式的幾種實現方式:

1.    懶漢式,執行緒不安全

lazy初始化:是

多執行緒安全:否

嚴格來說不算單例模式。

public static getinstance() 

return instance;

}

2.    懶漢式,執行緒安全

lazy初始化:是

執行緒安全:是

優點:第一次呼叫才生成例項,避免浪費內容

缺點:必須加鎖synchronized才能保證單例,加鎖會影響效率

public class singleobject 

public static synchronized singleobject getinstance()

return instance;

}}

3.   餓漢式

lazy初始化 否

執行緒安全 是

優點 沒有加鎖,提高效率

缺點 類載入時就生成例項,浪費內容

實質 基於classloder機制避免了多執行緒同步問題,產生類裝載的情況不少,但大多是呼叫單例的getinstance方法,也存在其他例如呼叫其他靜態方法的情況,這種情況下顯然沒達到lazyload的效果

public class singleobject 

private static singleobject getinstance()

public void showmsg()

}

4.    雙檢鎖

lazy 初始化是

執行緒安全 是

鎖**塊的好處,提高效率,過濾掉已經存在例項的物件

也不能鎖this synchronized(this), 因為靜態方法在類載入時就產生,類物件還沒生成。

synchronized(singleobject.class) = static synchronized void getinstance(){}

public class singleobject

private static singleobject getinstance()

return instance;}}

}}

5.    登記式、靜態內部類

lazy初始化 是

執行緒安全 是

設計模式筆記 3 單例模式

靜態 塊兒方式 懶漢式執行緒安全方式 doublecheck 靜態內部類方式 列舉 保證在整個軟體系統中,對某個類物件只能存在乙個例項,並且提供乙個取得其物件例項的方法。實現構造器私有化,屬性位置建立例項的靜態變數,提供靜態方獲取靜態例項。public class single 靜態例項 priva...

設計模式筆記 單例模式

單例模式在系統開發時很常見,乙個系統中可能會有多個單例模式的運用!它比全域性變數的好處?1.能控制生成時間,保證初始化順序?2.容易保證執行緒安全 全域性變數需要多執行緒client單獨控制併發,單例在類實現中已經做到,無需client再處理 3.減少函式模組之間的耦合,減少命名衝突,便於管理?可能...

設計模式筆記 單例模式

1 懶漢式 1 執行緒不安全 public class singleton public static singleton getinstance return singleton 缺點 不支援多執行緒。2 執行緒安全 public class singleton public static syn...