Flutter单例模式

分析

不搞骚操作的话,Flutter代码都是单线程运行的,至于线程安全,我找到了这样一段文章,似乎在说明在Flutter层上不用过于在意线程安全:

Platform Task Runner

Flutter Engine的主Task Runner,类似于Android Main Thread或者iOS的Main Thread。但是需要注意他们还是有区别的。

一般来说,一个Flutter应用启动的时候会创建一个Engine实例,Engine创建的时候会创建一个线程供Platform Runner使用。跟Flutter Engine的所有交互(接口调用)必须在Platform Thread进行,否则可能导致无法预期的异常。这跟iOS UI相关的操作都必须在主线程进行相类似。需要注意的是在Flutter Engine中有很多模块都是非线程安全的。

规则很简单,对于Flutter Engine的接口调用都需保证在Platform Thread进行。阻塞Platform Thread不会直接导致Flutter应用的卡顿(跟iOS android主线程不同)。尽管如此,也不建议在这个Runner执行繁重的操作,长时间卡住Platform Thread应用有可能会被系统Watchdog强杀。

实现

  • 懒汉式
class SingleClazz {
  static SingleClazz _instance;

  factory SingleClazz() => _getInstance();

  static SingleClazz _getInstance() {
    if (_instance == null) {
      _instance = SingleClazz._internal();
    }
    return _instance;
  }

	//命名构造函数
  SingleClazz._internal(); //可在此初始化一些引用
}
  • 饿汉式
class SingleClazz {
  static SingleClazz _instance = SingleClazz._internal();
  
  factory SingleClazz() => _getInstance();
  
  static SingleClazz _getInstance() {
    return _instance;
  }
  
  SingleClazz._internal();
}

使用场景

  • 需要频繁实例化然后销毁的对象
  • 创建对象时耗时过长、资源消耗过多,但又经常用到
  • 有状态的工具类
  • 频繁访问数据库或文件的对象