Java設計模式 | 單例模式

知非而進發表於2020-10-24

什麼是單例設計模式?

對於單例設計模式來說,其實和生活密不可分。假如說你的生活中有些東西只能有一個,比如親人。任何時間你想找父親開視訊聊天,找到的都是唯一的一個父親。不可能說兩次通話找到的不同的父親。例子可能不是很恰當。就是說這樣一個需求,每次獲取一個物件時,所拿到的物件都是同一個物件。

對單例來說其主要規則有如下三點:

1. 其構造器必須是private的,不能通過new來建立物件。
2. 只能通過唯一一個靜態函式來獲取物件
3. 因為只能通過靜態函式來獲取物件,所以其物件也必須是靜態且私有的。

對於單例設計模式,其實現方式有兩種:

  1. 餓漢式單例,程式啟動時就建立一個唯一的例項物件,即單例類定義的時候就進行例項化
  2. 懶漢式單例,當第一次使用時才建立一個唯一的例項物件,從而實現延遲載入的效果

餓漢式單例

public class Singleton
{
    //1.私有化構造器
    private Singleton()
    {

    }
    //2.內部建立私有靜態物件
    private static Singleton instance=new Singleton();

    //3.提供公共的靜態方法
    public static Singleton getInstance()
    {
        return instance;
    }
}

懶漢式單例

public class Singleton
{
    //1.私有化構造器
    private Singleton()
    {

    }
    //2.內部宣告私有靜態物件為null
    private static Singleton instance=null;

    //3.提供公共的靜態方法,判斷instance是否存在,不存在再建立
    public static Singleton getInstance()
    {
        if(instance==null)
        {
            instance=new Singleton();
        }
        return instance;
    }
}

餓漢和懶漢的區別

  • 餓漢,一開始就建立物件,可能還沒用到,載入的時間過長,其生命週期太長。其天然執行緒安全
  • 懶漢,延遲載入,等到用的時候才建立,節省記憶體。但是需要自己實現其執行緒安全。

執行緒安全的懶漢式單例

首先分析目前出現的執行緒不安全狀況,後續學完Java的多執行緒語法再來優化。


public static Singleton getInstance()
{
	if(instance==null)   //當第一個執行緒建立單例式,訪問到這一步,條件滿足,準備去new
	{                    //另外一個執行緒也訪問到這一步,第一個執行緒還沒訪問new,條件也滿足,這個執行緒也去new。
		instance=new Singleton();   //結果兩個執行緒各自new了一次。打破了單例
	}
	return instance;
}

單例的適用場景

拿我們的windows電腦來說,我們平常適用微信的時候,即使雙擊兩次,訪問的還是同一個微信程式。
還有比如工作管理員等等。

相關文章