Flutter 中的單例模式

本文是 FlutterTips 項目的第一篇,歡迎你們在同性交友社區 Star 本項目,謝謝你們!git

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

實現方法

首先咱們先看一下,在 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 餓漢模式

懶漢模式安全

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

餓漢模式工具

在類加載時,直接進行實例的建立。加載時獲取實例速度較慢,運行時速度較快。對上面的代碼作一個小的改動便可。spa

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

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

單例使用場景

  • 須要頻繁實例化而後銷燬的對象。
  • 建立對象時耗時過多或者耗資源過多,但又常常用到的對象。
  • 有狀態的工具類對象。
  • 頻繁訪問數據庫或文件的對象。

單例的風險

  • 因爲單例模式中沒有抽象的層,所以擴展單例類是一件很是困難的事情。
  • 濫用會帶來不少負面問題:好比佔用運行時資源,致使內存過限引起回收機制;長時間不使用可能會被錯誤的回收,致使狀態丟失等。
相關文章
相關標籤/搜索