單例模式
??一個類只允許創(chuàng)建一個實例熬甚,那這個類就是一個單例類,這種設計模式就叫作單例設計模式热凹,簡稱單例模式鹿霸。
??一般來說排吴,構(gòu)建一個單例類,由以下3部分構(gòu)成:
??1.一個引用自身類的靜態(tài)屬性實例;
??2.一個私有的類命名構(gòu)造函數(shù),確保不能從類外部實例化該類;
??3.用于返回實例的靜態(tài)方法.
??按返回實例的靜態(tài)方法的創(chuàng)建方式不同,flutter中創(chuàng)建單例模式,可以分為5種方法,如下圖所示:
image.png
??一.普通單例
class SingleTon {
//引用自身類的靜態(tài)屬性實例
static SingleTon? _instance;
//私有的命名構(gòu)造函數(shù),確保不能從類外部實例化該類
SingleTon._();
//用于返回實例的靜態(tài)方法,外部僅可以通過該方法訪問實例
static SingleTon getInstance() {
_instance ??= SingleTon._();
return _instance!;
}
}
??調(diào)用方式:
SingleTon singleTon = SingleTon.getInstance();
??二.Dart化之getter
class SingleTon {
//引用自身類的靜態(tài)屬性實例
static SingleTon? _instance;
//私有的命名構(gòu)造函數(shù),確保不能從類外部實例化該類
SingleTon._();
//和方法1的區(qū)別是,這里使用了getter方法.外部調(diào)用時,instance后面不需要加括號.
static SingleTon get instance(){
_instance ??= SingleTon._();
return _instance!;
}
}
??調(diào)用方式:
SingleTon singleTon = SingleTon.instance;
??三.Dart化之工廠函數(shù)
class SingleTon {
//引用自身類的靜態(tài)屬性實例
static SingleTon? _instance;
//私有的命名構(gòu)造函數(shù),確保不能從類外部實例化該類
SingleTon._();
//工廠函數(shù)
factory SingleTon() {
_instance ??= SingleTon._();
return _instance!;
}
}
??調(diào)用方式:
SingleTon singleTon = SingleTon();
??四.Dart化之工廠函數(shù)+箭頭函數(shù)
class SingleTon {
//引用自身類的靜態(tài)屬性實例
static SingleTon? _instance;
//私有的命名構(gòu)造函數(shù),確保不能從類外部實例化該類
SingleTon._();
//工廠函數(shù)+箭頭函數(shù)
factory SingleTon() => _instance ?? SingleTon._();
}
??調(diào)用方式同三.
??另外提一下,在dart的空安全中,有個重要的操作符late.被late修飾的變量,會在首次訪問時才會初始化.所以還可以有另外一個單例寫法:
class SingleTon {
//被late修飾后,變量在類加載時不會初始化,只有首次被訪問才會初始化
static late final SingleTon _instance = SingleTon._();
//私有的命名構(gòu)造函數(shù),確保不能從類外部實例化該類
SingleTon._();
factory SingleTon() => _instance;
}
??調(diào)用方式同三.
??五.Flutter化InheritedWidget
class _InheritedContainerState extends InheritedWidget {
final dynamic data;
const _InheritedContainerState({
Key? key,
required this.data,
required Widget child,
}) : super(key: key, child: child);
@override
bool updateShouldNotify(_InheritedContainerState oldWidget) => true;
}