單例類:
class Singleton {
/// 單例對象
static Singleton _instance;
/// 內(nèi)部構(gòu)造方法贷盲,可避免外部暴露構(gòu)造函數(shù)业汰,進(jìn)行實例化
Singleton._internal();
/// 工廠構(gòu)造方法糕珊,這里使用命名構(gòu)造函數(shù)方式進(jìn)行聲明
factory Singleton.getInstance() => _getInstance();
/// 獲取單例內(nèi)部方法
static _getInstance() {
// 只能有一個實例
if (_instance == null) {
_instance = Singleton._internal();
}
return _instance;
}
}
調(diào)用:
Singleton singleton = Singleton. getInstance();
TIPS :
- 當(dāng)然也可以將默認(rèn)構(gòu)造器的返回值修改為 _getInstance()
修改上面的代碼:
factory Singleton.getInstance() => _getInstance();
to :
factory Singleton() =>_getInstance()
static Singleton get instance => _getInstance();
調(diào)用:
// 無論如何初始化,取到的都是同一個對象
Singleton s1 = new Singleton();
Singleton s2 = Singleton.instance;
注: 兩種都可以欧引,但個人覺得為了安心听系,既然是單例,那就單單只有一種初始化寫法的好
- factory
作用是相同對象訪問緩存航棱,不需要再去執(zhí)行代碼睡雇;
- 對于線程安全
任何Dart程序的并發(fā)都是運行多個isolate的結(jié)果。因為Dart沒有共享內(nèi)存的并發(fā)饮醇,沒有競爭的可能性所以不需要鎖它抱,也就不用擔(dān)心死鎖的問題。
至于線程相關(guān)的問題朴艰,可以參考官方文檔 :
https://webdev.dartlang.org/articles/performance/event-loop