单例类:
class Singleton {
/// 单例对象
static Singleton _instance;
/// 内部构造方法,可避免外部暴露构造函数,进行实例化
Singleton._internal();
/// 工厂构造方法,这里使用命名构造函数方式进行声明
factory Singleton.getInstance() => _getInstance();
/// 获取单例内部方法
static _getInstance() {
// 只能有一个实例
if (_instance == null) {
_instance = Singleton._internal();
}
return _instance;
}
}
调用:
Singleton singleton = Singleton. getInstance();
TIPS :
- 当然也可以将默认构造器的返回值修改为 _getInstance()
修改上面的代码:
factory Singleton.getInstance() => _getInstance();
to :
factory Singleton() =>_getInstance()
static Singleton get instance => _getInstance();
调用:
// 无论如何初始化,取到的都是同一个对象
Singleton s1 = new Singleton();
Singleton s2 = Singleton.instance;
注: 两种都可以,但个人觉得为了安心,既然是单例,那就单单只有一种初始化写法的好
- factory
作用是相同对象访问缓存,不需要再去执行代码;
- 对于线程安全
任何Dart程序的并发都是运行多个isolate的结果。因为Dart没有共享内存的并发,没有竞争的可能性所以不需要锁,也就不用担心死锁的问题。
至于线程相关的问题,可以参考官方文档 :
https://webdev.dartlang.org/articles/performance/event-loop