Flutter 中的單例模式

Panda正在格式化發表於2019-03-09

本文是 FlutterTips 專案的第一篇,歡迎大家在同性交友社群 Star 本專案,謝謝大家!

單例模式是日常開發中最常用的設計模式之一,在工作中各種 Manager 和 SharedInstance 層出不窮。本文就分享一下單例在 Flutter 中的使用。

實現方法

首先我們先看一下,在 Flutter 中如何實現一個單例。

class SomeSharedInstance {
  // 單例公開訪問點
  factory SomeSharedInstance() =>_sharedInstance()
  
  // 靜態私有成員,沒有初始化
  static SomeSharedInstance _instance;
  
  // 私有建構函式
  SomeSharedInstance._() {
    // 具體初始化程式碼
  }

  // 靜態、同步、私有訪問點
  static SomeSharedInstance _sharedInstance() {
    if (_instance == null) {
      _instance = SomeSharedInstance._();
    }
    return _instance;
  }
}
複製程式碼

如上所示,我們首先定義了一個類 SomeSharedInstance,在業務中我們通過定義 SomeSharedInstance() 方法返回一個對單例的懶載入:如果不存在則初始化,如果存在則返回。因為 Dart 是一個單執行緒的語言,所以其呼叫是執行緒安全的,這意味著我們全域性有且僅有一個 _instance

知識點

懶漢模式 vs 餓漢模式

懶漢模式

在類載入時,不建立例項。載入時速度較快,執行時獲取例項速度較慢。 上面的例子就是懶漢模式,它適用於絕大多數的場景。

餓漢模式

在類載入時,直接進行例項的建立。載入時獲取例項速度較慢,執行時速度較快。對上面的程式碼做一個小的改動即可。

class SomeSharedInstance {
  // 單例公開訪問點
  factory SomeSharedInstance() =>_sharedInstance()
  
  // 靜態私有成員,沒有初始化
  static SomeSharedInstance _instance = SomeSharedInstance._();
  
  // 私有建構函式
  SomeSharedInstance._() {
    // 具體初始化程式碼
  }

  // 靜態、同步、私有訪問點
  static SomeSharedInstance _sharedInstance() {
    return _instance;
  }
}
複製程式碼

單例使用場景

  • 需要頻繁例項化然後銷燬的物件。
  • 建立物件時耗時過多或者耗資源過多,但又經常用到的物件。
  • 有狀態的工具類物件。
  • 頻繁訪問資料庫或檔案的物件。

單例的風險

  • 由於單例模式中沒有抽象的層,因此擴充套件單例類是一件非常困難的事情。
  • 濫用會帶來很多負面問題:比如佔用執行時資源,導致記憶體過限引發回收機制;長時間不使用可能會被錯誤的回收,導致狀態丟失等。

相關文章