Dart 为什么单例模式从来没有显示为带有const构造函数的类?
这是一种确保我们只创建一个类实例的模式 大多数情况下,单例模式显示为:Dart 为什么单例模式从来没有显示为带有const构造函数的类?,dart,singleton,Dart,Singleton,这是一种确保我们只创建一个类实例的模式 大多数情况下,单例模式显示为: class Settings { static final Settings _instance = Settings._internal(); factory Settings() { return _instance; } Settings._internal() {} } 缺点:难以测试,违反单一责任 那么: class Singleton{
class Settings {
static final Settings _instance = Settings._internal();
factory Settings() {
return _instance;
}
Settings._internal() {}
}
缺点:难以测试,违反单一责任
那么:
class Singleton{
const Singleton();
}
Singleton s1= const Singleton();
Singleton s2= const Singleton();
void main() {
print(s1==s2); //true
}
易于测试。对象只有一个1责任
我的问题是,为什么人们会让生活变得更加困难,并且从不使用const构造函数实现单例。我遗漏了什么吗?除了Christopher Moore关于
常量的评论之外,不可变的单例不太可能有用,非工厂常量构造函数不能保证单个实例,这将违反单例模式。调用方需要在const
上下文中显式调用构造函数:
class-Foo{
const Foo();
}
void main()异步{
常量foo1=Foo();
常量foo2=Foo();
var foo3=Foo();
print(foo1==foo2);//Prints:true
打印(foo1==foo3);//打印:false
}
相比之下,工厂
构造函数可以保证只创建一个实例,而不会给调用方带来额外负担。除了Christopher Moore关于常量
的评论之外,不可变单例不太可能有用,非工厂
常量
构造函数不保证单个实例,这将违反单例模式。调用方需要在const
上下文中显式调用构造函数:
class-Foo{
const Foo();
}
void main()异步{
常量foo1=Foo();
常量foo2=Foo();
var foo3=Foo();
print(foo1==foo2);//Prints:true
打印(foo1==foo3);//打印:false
}
相比之下,工厂
构造函数可以保证只创建一个实例,而不会给调用方带来额外负担。因为像您展示的那样的单实例是非常无用的。您不能更改任何字段。首先,你为什么需要一个“单例”呢?你能详细说明一下你展示的常量单例的用途吗?也许它可以取代大多数人使用singleton的功能?要使用常量构造函数创建编译时常量,请将const关键字放在构造函数名称之前。构造两个相同的编译时常量将生成一个规范的实例是const
的全部目的。顺便说一句,没有人尝试对常量使用单例模式。人们使用单例模式作为获取句柄的方法,该句柄允许在应用程序的不同作用域中访问相同的数据。您将展示一个没有字段的单例实现,它与您所建议的const
构造函数一样有用。但是大多数人不使用没有非final字段的单例,因此不能将其视为替代项,因为像您显示的单例是非常无用的。您不能更改任何字段。首先,你为什么需要一个“单例”呢?你能详细说明一下你展示的常量单例的用途吗?也许它可以取代大多数人使用singleton的功能?要使用常量构造函数创建编译时常量,请将const关键字放在构造函数名称之前。构造两个相同的编译时常量将生成一个规范的实例是const
的全部目的。顺便说一句,没有人尝试对常量使用单例模式。人们使用单例模式作为获取句柄的方法,该句柄允许在应用程序的不同作用域中访问相同的数据。您将展示一个没有字段的单例实现,它与您所建议的const
构造函数一样有用。但是大多数人不使用没有非final字段的singleton,因此不能将其视为替代。