我读了这些帖子:
我很难理解以下创建单身的方法之间的区别:
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
现在是可选的,使得工厂构造函数现在变得不必要了。在你不能做像Singleton2
或Singleton3
这样的事情之前?
Günter Zöchbauer还说:
您还可以将静态最终DbHelper_db=new DbHelper._constr();更改为静态最终DbHelper Singleton=new DbHelper._constr();并删除我在回答中建议的单例getter。这取决于您的用例。如果您需要额外的配置值来创建实例,您可能无法使用字段初始化器。但在您的示例中,这就足够了。
以上每个单例模式(单例一、单例二和单例三)的用例是什么?为每一个例子看一看会很有帮助。如果想隐藏类是单例的事实(如本文所述),工厂模式不是很有用吗?
由于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!;
}
}
正如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。谢了。