singleton.jpg
模式定義
單利模式(Singleton pattern): 確保某個類只有一個實例,而且自行實例化,并向整個系統提供這個實例
模式結構
UML 圖
singleton_uml.png
代碼示例
class singleton
{
private static $instance;
public static function getInstance()
{
if(null === self::$instance){
self::$instance = new Singleton();
}
return self::$instance;
}
// 防止在類的外部被實例化
private function __construct()
{
}
//防止被克隆
private function __clone()
{
}
// 防止被反序列化
private function __wakeup()
{
}
}
模式優點
- 提供了對唯一實例的受控訪問。因為單例類封裝了它的唯一實例,所以它可以嚴格控制客戶怎樣以及何時訪問它,并為設計及開發團隊提供了共享的概念。
- 由于在系統內存中只存在一個對象,因此可以節約系統資源,對于一些需要頻繁創建和銷毀的對象,單例模式無疑可以提高系統的性能
- 允許可變數目的實例。我們可以基于單例模式進行擴展,使用與單例控制相似的方法來獲得指定個數的對象實例。
模式的缺點
- 由于單例模式中沒有抽象層,因此單例類的擴展有很大的困難。
- 單例類的職責過重,在一定程度上違背了“單一職責原則”。因為單例類既充當了工廠角色,提供了工廠方法,同時又充當了產品角色,包含一些業務方法,將產品的創建和產品的本身的功能融合到一起。
- 濫用單例將帶來一些負面問題,如為了節省資源將數據庫連接池對象設計為單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出;現在很多面向對象語言(如Java、C#)的運行環境都提供了自動垃圾回收的技術,因此,如果實例化的對象長時間不被利用,系統會認為它是垃圾,會自動銷毀并回收資源,下次利用時又將重新實例化,這將導致對象狀態的丟失。