在不考虑线程安全的情况下,我们写一个单例通常是声明一个静态对象,然后在单例方法中判断
class Singleton {
static Singleton? _singleton;
// 私有的命名函数,声明后,用户无法通过Singleton()创建一个新的对象
Singleton._internal();
static Singleton getInstance() {
if (_singleton == null) {
_singleton = Singleton._internal();
}
return _singleton;
// 上述判断空的在初始化的代码,可以简化成
// return _instance ??= Singleton._internal();
}
// 这样又可以换成箭头符号
static Singleton getInstance() => _instance ??= Singleton._internal();
}
// 使用
var s = Singleton.getInstance();
在dart中,我们可以不用写一个静态方法,而是写一个静态属性的get方法
class Singleton {
static Singleton _instance;
Singleton._internal();
static Singleton get instance => _intance ??= Singleton._internal();
}
// 使用
var s = Singleton.instance;
通过工厂模式,可以不用通过get方法获取单例
class Singleton {
static Singleton _instance;
Singleton._internal();
factory Singleton() => _instance ??= Singleton._internal();
}
// 使用
var s = Singleton();
由于dart有final描述符,即初始化一次后不会再被初始化,所以我们也可以这样
class Singleton {
Singleton._internal();
factory Singleton() => _instance;
static final Singleton _instance = Singleton._internal();
}
// 使用
var s = Singleton();