構(gòu)造函數(shù)類型
1. 默認(rèn)構(gòu)造函數(shù)
class MyClass {
MyClass() {
// 初始化代碼
}
}
2. 命名構(gòu)造函數(shù)
class MyClass {
MyClass.myNamedConstructor() {
// 初始化代碼
}
}
// 調(diào)用
var myObject = MyClass.myNamedConstructor();
3. 工廠構(gòu)造函數(shù)
class MyClass {
factory MyClass() {
return MyClass._internal();
}
MyClass._internal() {
// 初始化代碼
}
}
4. 常量構(gòu)造函數(shù)
class MyClass {
final int value;
const MyClass(this.value);
}
單例
1. 餓漢式單例
class Singleton {
// 靜態(tài)實例,立即初始化
static final Singleton _instance = Singleton._internal();
// 私有構(gòu)造函數(shù)
Singleton._internal();
// 提供一個全局訪問點
factory Singleton() {
return _instance;
}
}
-
優(yōu)點
實現(xiàn)簡單:代碼簡潔惦蚊,易于理解辞州。
線程安全:由于實例在類加載時創(chuàng)建逃贝,天然具備線程安全性。 -
缺點
資源浪費:實例在類加載時就創(chuàng)建程剥,即使從未使用過該實例劝枣,也會占用內(nèi)存。
缺乏靈活性:沒有延遲加載的優(yōu)勢倡缠。
2. 懶漢式單例 (Lazy Initialization)
class Singleton {
static Singleton? _instance;
// 私有構(gòu)造函數(shù)
Singleton._internal();
// 提供一個全局訪問點
factory Singleton() {
_instance ??= Singleton._internal();
return _instance!;
}
}
-
優(yōu)點
延遲加載:只有在第一次使用時才創(chuàng)建實例哨免,節(jié)省內(nèi)存。
實現(xiàn)簡單:代碼相對簡單昙沦。 -
缺點
線程不安全:在多線程環(huán)境下可能會創(chuàng)建多個實例琢唾,需要額外的同步機(jī)制確保線程安全。
3. 使用 Dart 的靜態(tài)變量
class Singleton {
// 靜態(tài)實例盾饮,立即初始化
static final Singleton instance = Singleton._internal();
// 私有構(gòu)造函數(shù)
Singleton._internal();
}
-
優(yōu)點
實現(xiàn)簡單:代碼極其簡潔采桃,易于理解。
線程安全:由于實例在類加載時創(chuàng)建丘损,天然具備線程安全性普办。 -
缺點
資源浪費:實例在類加載時就創(chuàng)建,即使從未使用過該實例徘钥,也會占用內(nèi)存衔蹲。
缺乏靈活性:沒有延遲加載的優(yōu)勢。
4. 使用 get 方法懶加載
class Singleton {
static Singleton? _instance;
Singleton._internal();
static Singleton get instance {
_instance ??= Singleton._internal();
return _instance!;
}
}
-
優(yōu)點
延遲加載:只有在第一次使用時才創(chuàng)建實例呈础,節(jié)省內(nèi)存舆驶。
實現(xiàn)簡單:代碼相對簡單。 -
缺點
線程不安全:在多線程環(huán)境下可能會創(chuàng)建多個實例而钞,需要額外的同步機(jī)制確保線程安全沙廉。
5. 使用 Dart 的 late 關(guān)鍵字(推薦)
class Singleton {
static late final Singleton _instance = Singleton._internal();
Singleton._internal();
static Singleton get instance => _instance;
}
-
優(yōu)點
延遲加載:只有在第一次訪問時才初始化實例,節(jié)省內(nèi)存臼节。
線程安全:Dart 的 late 關(guān)鍵字確保實例只被初始化一次撬陵,天然線程安全珊皿。 -
缺點
語言特性依賴:需要 Dart 2.12 及以上版本支持 late 關(guān)鍵字。
單例實現(xiàn)方案 比較總結(jié)
餓漢式單例 適用于應(yīng)用啟動時就需要實例巨税,并且實例創(chuàng)建開銷不大的場景蟋定。
懶漢式單例 適用于實例創(chuàng)建開銷較大,且可能并不總是需要實例的場景垢夹,但需要注意線程安全溢吻。
靜態(tài)變量單例 適用于實例創(chuàng)建開銷不大,且需要簡單實現(xiàn)的場景果元。
get 方法懶加載 適用于需要延遲加載且愿意在實現(xiàn)中做一些妥協(xié)的場景促王。
late 關(guān)鍵字 是現(xiàn)代 Dart 中推薦的方式,結(jié)合了延遲加載和線程安全的優(yōu)勢而晒。