Dart 中的单例模式

单例类:

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 :

  1. 当然也可以将默认构造器的返回值修改为 _getInstance()
    修改上面的代码:
  factory Singleton.getInstance() => _getInstance();

to :

factory Singleton() =>_getInstance()
static Singleton get instance => _getInstance();

调用:

// 无论如何初始化,取到的都是同一个对象
Singleton s1 = new Singleton();
Singleton s2 = Singleton.instance;

注: 两种都可以,但个人觉得为了安心,既然是单例,那就单单只有一种初始化写法的好

  1. factory

作用是相同对象访问缓存,不需要再去执行代码;

  1. 对于线程安全

任何Dart程序的并发都是运行多个isolate的结果。因为Dart没有共享内存的并发,没有竞争的可能性所以不需要锁,也就不用担心死锁的问题。
至于线程相关的问题,可以参考官方文档 :
https://webdev.dartlang.org/articles/performance/event-loop