本文是 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;
}
}
複製程式碼
單例使用場景
- 需要頻繁例項化然後銷燬的物件。
- 建立物件時耗時過多或者耗資源過多,但又經常用到的物件。
- 有狀態的工具類物件。
- 頻繁訪問資料庫或檔案的物件。
單例的風險
- 由於單例模式中沒有抽象的層,因此擴充套件單例類是一件非常困難的事情。
- 濫用會帶來很多負面問題:比如佔用執行時資源,導致記憶體過限引發回收機制;長時間不使用可能會被錯誤的回收,導致狀態丟失等。