4

Flutter 设计模式:Singleton 单例

 3 years ago
source link: https://sexywp.com/flutter-singleton.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Flutter 设计模式:Singleton 单例

候选人来公司面试,我要求必须考察代码功力,一般我自己喜欢考个简单的算法题,有个同事,他喜欢考候选人写一个单例模式。单例模式可能是所有设计模式里,最最常用和常见的一个模式了。

单例模式的目的是保证在整个系统里,对象实例唯一,主要是一些昂贵的资源,或者唯一性的资源,构建成本高或者不允许被复制。所以,需要利用语言特性来保证对象实例的唯一性。

单例模式有几个特点:

  1. 私有的静态实例变量指向唯一实例;
  2. 私有的构造函数确保对象不能被直接构造;
  3. 静态的 getInstance() 方法/属性,可以访问到唯一实例;
  4. 线程安全;(多线程、多进程语言必须考虑这个);

在 Dart 里如何实现单例模式:

class Singleton {
// 静态变量指向自身
static final Singleton _instance = Singleton._();
// 私有构造器
Singleton._();
// 方案1:静态方法获得实例变量
static Singleton getInstance() => _instance;
// 方案2:工厂构造方法获得实例变量
factory Singleton() => _instance;
// 方案3:静态属性获得实例变量
static Singleton get instance => _instance;
class Singleton {
  // 静态变量指向自身
  static final Singleton _instance = Singleton._();
  // 私有构造器
  Singleton._();
  // 方案1:静态方法获得实例变量
  static Singleton getInstance() => _instance;
  // 方案2:工厂构造方法获得实例变量
  factory Singleton() => _instance;
  // 方案3:静态属性获得实例变量
  static Singleton get instance => _instance;
}

在上面的范例代码里,展示了三种返回实例变量的方法。这里简单分析一下:

方案 1, 是最经典的写法,这么写准没错,使用唯一的静态方法来获得类实例变量;

方案 2,是 Dart 里特有的语法糖,使得看起来很优雅,虽然用了构造函数,仍然实现了单例模式;

方案 3,也是一种语法糖,其实跟方案 1 差不多,本质上都是静态方法,不过省去了括号。

那么,使用静态方法和工厂构造函数,是否就完全等价呢?我本来也是这么以为的。不过,实践中我发现一些区别。上面的例子太过抽象,所以,看不出来区别。设想一下,现实中,你的单例,不可能像例子一样空空荡荡的,往往里面需要保护一些资源,前面也分析了,这些资源往往构造成本较高,这就涉及到一个问题 —— 异步。

如果,你的单例类有属性的初始化,是异步的,那么这时候,就要小心选择,因为工厂构造方法,不能是异步的。假如,你要确保所有的属性,在单例形成的时候,必须被初始化完毕,又正好有一个属性的构造是异步的,那么,你只剩下使用静态方法这个方案了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK