極簡設計模式-單例模式

long2ge發表於2021-11-11

定義

一個類只擁有一個例項,且能提供全域性訪問的方法。

一句話概括設計模式

一個類只例項化一次。

結構中包含的角色

Singleton 單例物件

最小可表達程式碼

// final 不能繼承
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;
    }
}

設計的原則和思想

控制物件建立的數量。

優點

  1. 記憶體中只存在一個物件,可以節約系統資源。
  2. 基於單例模式,我們可以透過控制指定數量的物件實現多例或者物件池模式。
  3. 全域性只有唯一獲取例項的地方,嚴格控制使用者怎樣訪問它。(因為自身有充當工廠的角色)

缺點

  1. 隱藏類之間的依賴關係
  2. 對程式碼的可測試性不友好
  3. 不支援有引數的建構函式
  4. 沒有抽象層,對程式碼的擴充套件性不友好。
  5. 職責過重,充當了工廠和產品角色,違反了單一職責原則。
  6. OOP的四大特性是封裝、抽象、繼承、多型。單例這種設計模式對於其中的抽象、繼承、多型都支援得不好。

何時使用

  1. 當您想控制例項數目,節省系統資源時。
  2. 系統只需要一個例項物件時。
  3. 控制使用者怎樣獲取例項,因為全域性只有一處生成例項的地方。

實際應用場景

  1. Laravel的DB類。
  2. 使用者瀏覽企業的瀏覽次數。

單例的替代方案

  1. 工廠模式
  2. IOC 容器
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Long2Ge

相關文章