定義
一個類只擁有一個例項,且能提供全域性訪問的方法。
一句話概括設計模式
一個類只例項化一次。
結構中包含的角色
Singleton 單例物件
最小可表達程式碼
final class Singleton
{
private static $instance;
private function __construct(){}
private function __clone(){}
private function __wakeup(){}
public static function getInstance() : Singleton
{
if (null === static::$instance) {
static::$instance = new static();
}
return static::$instance;
}
}
設計的原則和思想
控制物件建立的數量。
優點
- 記憶體中只存在一個物件,可以節約系統資源。
- 基於單例模式,我們可以透過控制指定數量的物件實現多例或者物件池模式。
- 全域性只有唯一獲取例項的地方,嚴格控制使用者怎樣訪問它。(因為自身有充當工廠的角色)
缺點
- 隱藏類之間的依賴關係
- 對程式碼的可測試性不友好
- 不支援有引數的建構函式
- 沒有抽象層,對程式碼的擴充套件性不友好。
- 職責過重,充當了工廠和產品角色,違反了單一職責原則。
- OOP的四大特性是封裝、抽象、繼承、多型。單例這種設計模式對於其中的抽象、繼承、多型都支援得不好。
何時使用
- 當您想控制例項數目,節省系統資源時。
- 系統只需要一個例項物件時。
- 控制使用者怎樣獲取例項,因為全域性只有一處生成例項的地方。
實際應用場景
- Laravel的DB類。
- 使用者瀏覽企業的瀏覽次數。
單例的替代方案
- 工廠模式
- IOC 容器
本作品採用《CC 協議》,轉載必須註明作者和本文連結