《23種設計模式》四 單例模式

2021-08-14 10:21:29 字數 2272 閱讀 2149

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類乙個類只有乙個例項。即乙個類只有乙個物件例項

對於系統中的某些類來說,只有乙個例項很重要,例如,乙個系統中可以存在多個列印任務,但是只能有乙個正在工作的任務;乙個系統只能有乙個視窗管理器或檔案系統;乙個系統只能有乙個計時工具或id(序號)生成器。如在windows中就只能開啟乙個任務管理器。如果不使用機制對視窗物件進行唯一化,將彈出多個視窗,如果這些視窗顯示的內容完全一致,則是重複物件,浪費記憶體資源;如果這些視窗顯示的內容不一致,則意味著在某一瞬間系統有多個狀態,與實際不符,也會給使用者帶來誤解,不知道哪乙個才是真實的狀態。因此有時確保系統中某個物件的唯一性即乙個類只能有乙個例項非常重要。

如何保證乙個類只有乙個例項並且這個例項易於被訪問呢?定義乙個全域性變數可以確保物件隨時都可以被訪問,但不能防止我們例項化多個物件。乙個更好的解決辦法是讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項被建立,並且它可以提供乙個訪問該例項的方法。這就是單例模式的模式動機。

話不多說、直接上**:

第一種(懶漢,執行緒不安全):

/**

* 這種寫法能夠在多執行緒中很好的工作,而且看起來它也具備很好的lazy loading,但是,遺憾的是,效率很低,99%情況下不需要同步。

*/public class singleton   

public static synchronized singleton getinstance()   

return instance;  

}  }

第二種(懶漢,執行緒安全):

/**

* 這種寫法能夠在多執行緒中很好的工作,而且看起來它也具備很好的lazy loading,但是,遺憾的是,效率很低,99%情況下不需要同步。

*/public class singleton

public static synchronized singleton getinstance()

return instance;

}}

第三種(餓漢):

/**

* 這種方式基於classloder機制避免了多執行緒的同步問題,不過,instance在類裝載時就例項化,雖然導致類裝載的原因有很多種,

* 在單例模式中大多數都是呼叫getinstance方法,

* 但是也不能確定有其他的方式(或者其他的靜態方法)導致類裝載,這時候初始化instance顯然沒有達到lazy loading的效果。

*/public class singleton

public static singleton getinstance()

}

第四種(靜態內部類):

/**

* 這種方式同樣利用了classloder的機制來保證初始化instance時只有乙個執行緒,它跟第三種和第四種方式不同的是(很細微的差別)

* 第三種和第四種方式是只要singleton類被裝載了,那麼instance就會被例項化(沒有達到lazy loading效果),而這種方式是

* singleton類被裝載了,instance不一定被初始化。因為singletonholder類沒有被主動使用,

* 只有顯示通過呼叫getinstance方法時,才會顯示裝載singletonholder類,從而例項化instance。想象一下,

* 如果例項化instance很消耗資源,我想讓他延遲載入。另外一方面,我不希望在singleton類載入時就例項化,

* 因為我不能確保singleton類還可能在其他的地方被主動使用從而被載入,那麼這個時候例項化instance顯然是不合適的。這個時候,

* 這種方式相比第三和第四種方式就顯得很合理。

*/public class singleton

private singleton()

public static final singleton getinstance()

}

第五種(雙重校驗鎖):

/**

* 這個是第二種方式的公升級版,俗稱雙重檢查鎖定,在jdk1.5之後,雙重檢查鎖定才能夠正常達到單例效果。

*/public class singleton

public static singleton getsingleton()

} }

return singleton;

}

23種設計模式 單例模式

某些情況,如 執行緒池,乙個專案中匯流排程數量以及生命週期,可能需要統一控制 如果執行緒池自身可建立多個例項,那麼就無法統一控制,此時,只要能控制線程池物件的數量為乙個,那麼就可以實現統一控制的目標 注意 現實中真正使用純的單例模式並不多 如 spring bean 通過配置來決定是否使用單例 執行...

單例模式(23種設計模式)

單例模式 餓漢模式 class singletondemo public static singletondemo gets 懶漢模式 class singletondemo1 public static singletondemo1 gets return instance 單例模式,懶漢式,執行...

23種設計模式 單例模式

單例模式需要保證,構造方法一定是私有化的,並且類的全域性變數必須是靜態的,私有的 這樣才能有唯一的例項化途徑 錯誤 一 public class singleton public static singleton getinstance 上述方法,並沒有把類變數singleton設定為靜態的,這樣,...