当前位置: 首页 > 知识库问答 >
问题:

比较在Dart中创建单件的方法

钱远
2023-03-14

我读了这些帖子:

  • 如何在Dart中构建一个单体
  • 如何使用工厂构造函数在Dart中实现单例模式
  • Dart中的对象结构

我很难理解以下创建单身的方法之间的区别:

1.工厂建造师

class SingletonOne {

  SingletonOne._privateConstructor();

  static final SingletonOne _instance = SingletonOne._privateConstructor();

  factory SingletonOne(){
    return _instance;
  }

}

2.含有吸气剂的静电场

class SingletonTwo {

  SingletonTwo._privateConstructor();

  static final SingletonTwo _instance = SingletonTwo._privateConstructor();

  static SingletonTwo get instance { return _instance;}

}

3.静电场

class SingletonThree {

  SingletonThree._privateConstructor();

  static final SingletonThree instance = SingletonThree._privateConstructor();

}

这些示例如下所示:

SingletonOne one = SingletonOne();
SingletonTwo two = SingletonTwo.instance;
SingletonThree three = SingletonThree.instance;

Günter Zöchbauer对这个问题说:

不需要使用工厂构造函数。当new还不是可选的时,工厂构造函数很方便,因为它new MyClass()适用于构造函数每次返回新实例或类返回缓存实例的类。调用方没有责任知道对象是如何以及何时实际创建的。

我不明白为什么new现在是可选的,使得工厂构造函数现在变得不必要了。在你不能做像Singleton2Singleton3这样的事情之前?

Günter Zöchbauer还说:

您还可以将静态最终DbHelper_db=new DbHelper._constr();更改为静态最终DbHelper Singleton=new DbHelper._constr();并删除我在回答中建议的单例getter。这取决于您的用例。如果您需要额外的配置值来创建实例,您可能无法使用字段初始化器。但在您的示例中,这就足够了。

以上每个单例模式(单例一、单例二和单例三)的用例是什么?为每一个例子看一看会很有帮助。如果想隐藏类是单例的事实(如本文所述),工厂模式不是很有用吗?

共有2个答案

孙凌龙
2023-03-14

由于Dart允许根级别变量,因此可以创建一个非常好的延迟加载单例:

final store = _Store();

class _Store {
//
}

像您的其他三个例子一样,如果您需要异步构造,这将不起作用。此外,像SingletonTwo和SingletonThree一样,您不能从调用范围传递任何参数。

对于需要异步结构和参数的单例,我会使用这样的东西:

class StoreService {
  static StoreService? _instance;

  StoreService._() {}

  static Future<StoreService> instance() async {
    // we can await things here
    
    if (_instance == null) {
      _instance = StoreService._();
    }

    return _instance!;
  }
}
裴嘉良
2023-03-14

正如Günter Zöchbauer在评论中所说,你列出的三种创建单身的方法都是相同的。根据个人喜好选择一个。

我要添加一些额外的注释:

  • SingletonOne实例化时看起来和其他类一样。所以如果你想隐藏它是一个单例的事实,你可以使用这个(并保留使它将来不再是单例的选项)。你也可以在构造函数中传递参数
  • SingletonTwo将允许您在返回实例之前执行其他工作。
  • Singleton3是最短的,在我的书中,在其他条件相同的情况下,短而干净的代码是可取的。
 类似资料:
  • 问题内容: 我正在为生成Excel文件(二进制文件)的某些代码编写JUnit测试。我还有另一个包含预期输出的Excel文件。将实际文件与预期文件进行比较的最简单方法是什么? 当然,我可以自己编写代码,但是我想知道在受信任的第三方库(例如Spring或Apache Commons)中是否已有这样做的方法。 问题答案: 这就是我最终要做的(由DBUnit完成繁重的工作): 这将比较两个文件中的数据,没

  • 我在网上找不到如何比较文件之间的单词的任何例子。我需要确定文件之间共享的字数和每个文件(相对于其他文件)唯一的字数。我的最终输出应该包括7个数字:文件1和文件2的总字数,文件1和文件2的唯一字数,文件1和文件2之间共享的字的#,文件1中但不在文件2中的字的#,以及文件2中但不在文件1中的字的#。我知道我必须使用set()来完成此操作,但我不明白如何操作。 期望输出:

  • 问题内容: 我有2个字符串对象的arraylists。 我有一些逻辑需要处理源列表,最终会得到目标列表。目标列表将有一些其他元素添加到源列表或从源列表中删除。 我的预期输出是string的2 ArrayList,其中第一个列表应具有从源中删除的所有字符串,第二个列表应具有所有新添加到源中的字符串。 有没有更简单的方法来实现这一目标? 问题答案: 将列表转换为 并使用 输出: [编辑] 其他方式(更

  • 单例模式确保只创建一个类的实例。我如何在飞镖中建立这个?

  • 我有一个关于compareTo函数如何帮助比较器排序的问题,即o1。比较(o2)与o2。比较(o1) 如果两个字符串相等,则此方法返回0,否则返回正值或负值。如果第一个字符串在词典上大于第二个字符串,则结果为正,否则结果为负。 上面的陈述很简单,但是为什么o1.compare(o2)会给我一个升序,而o2.compare(o1)给了我一个降序? 如果我有整数值“5,10,3”,我得到3,5,10和

  • 我如何做到这一点?基本上映射列表中的每个字符串来创建一个对象,将其与fix对象进行比较,并基于其中一个属性返回max。谢了。